📄 commond_action.c
字号:
return SCUESS;
}
int change_dir(char *valus)
{
memset(pwd,0,500);
getcwd(pwd,500);
memset(commond_buffer,0,100);
if (chdir(valus)<0)
{
memcpy(commond_buffer,"550 Failed to change directory.\r\n",strlen("550 Failed to change directory."));
return FAIL;
}
getcwd(pwd,500);
sprintf(commond_buffer,"250 Directory changed to %s\r\n",valus);
return SCUESS;
}
int cdup(char *valus)
{
chdir("..");
memset(pwd,0,500);
getcwd(pwd,500);
memset(commond_buffer,0,100);
sprintf(commond_buffer,"250 Directory changed to %s\r\n",pwd);
return SCUESS;
}
int noop(char *valus)
{
memset(commond_buffer,0,100);
memcpy(commond_buffer,"200 Command okay.\r\n",strlen("200 Command okay.\r\n"));
return SCUESS;
}
int quit(char *valus)
{
memset(commond_buffer,0,100);
memcpy(commond_buffer,"221 Goodbye!\r\n",strlen("221 Goodbye!\r\n"));
return SCUESS;
}
int help(char *valus)
{
memset(commond_buffer,0,100);
memcpy(commond_buffer,"214- The following commands are recognized (* => unimplemented).\r\n",strlen("214- The following commands are recognized (* => unimplemented).\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
memset(commond_buffer,0,100);
memcpy(commond_buffer," USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT\r\n",strlen(" USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
memset(commond_buffer,0,100);
memcpy(commond_buffer," PASS PASV STOR REST CWD STAT RMD XCUP OPTS\r\n",strlen(" PASS PASV STOR REST CWD STAT RMD XCUP OPTS\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
memset(commond_buffer,0,100);
memcpy(commond_buffer," ACCT TYPE APPE RNFR XCWD HELP XRMD STOU AUTH\r\n",strlen(" ACCT TYPE APPE RNFR XCWD HELP XRMD STOU AUTH\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
memset(commond_buffer,0,100);
memcpy(commond_buffer," REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ\r\n",strlen(" REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
memset(commond_buffer,0,100);
memcpy(commond_buffer," QUIT MODE SYST ABOR NLST MKD XPWD MDTM PROT\r\n",strlen(" QUIT MODE SYST ABOR NLST MKD XPWD MDTM PROT\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
memset(commond_buffer,0,100);
memcpy(commond_buffer,"214 Direct comments or bugs to bugs@bugs.com.\r\n",strlen("214 Direct comments or bugs to bugs@bugs.com.\r\n"));
return SCUESS;
}
int pasv_connection(char *valus)//还有问题
{
struct sockaddr_in curr_sock,data_lisen_addr;
int len=sizeof(struct sockaddr_in);
char ser_ip_addr[20]={0};
int p_f=0,p_l=0;
pid_t ch;
client_infor.connect_mode=PASV;
/* memset(commond_buffer,0,100);
sprintf(commond_buffer,"227 Entering Passive Mode (%s,0,20)\r\n",ser_ip_addr);*/
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
client_infor.socket_data_listen=socket(AF_INET,SOCK_STREAM,0);
if (client_infor.socket_data_listen<0)
{
perror("PASV sock error");
return FAIL;
}
data_lisen_addr.sin_family=AF_INET;
data_lisen_addr.sin_port=htons(0);
data_lisen_addr.sin_addr.s_addr=INADDR_ANY;
if (bind(client_infor.socket_data_listen,(struct sockaddr*)&data_lisen_addr,len)<0)
{
perror("PASV bind error");
return FAIL;
}
if (listen(client_infor.socket_data_listen,10)<0)
{
perror("PASV listen error");
return FAIL;
}
getsockname(client_infor.socket_data_listen,&curr_sock,&len);
strcpy(ser_ip_addr,inet_ntoa(curr_sock.sin_addr.s_addr));
replace_of(ser_ip_addr,'.',',');
client_infor.port_num=ntohl(curr_sock.sin_port);
p_f=client_infor.port_num/256;
p_l=client_infor.port_num%256;
return SCUESS;
}
int upload(char *valus)
{
int fp;
fp=open(valus,O_WRONLY|O_CREAT);
if (fp<0)
{
perror("open file to upload error");
memset(commond_buffer,0,100);
memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
return FAIL;
}
lseek(fp,client_infor.file_offset,SEEK_CUR);
client_infor.file_offset=0;
char buffer[500];
memset(buffer,0,500);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
int len=sizeof(struct sockaddr_in);
int count=0;
pid_t ch;
if (client_infor.connect_mode == PORT)
{
client_infor.socket_port=socket(AF_INET,SOCK_STREAM,0);
if (client_infor.socket_port<0)
{
perror("create port sock error");
memset(commond_buffer,0,100);
memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
return FAIL;
}
addr.sin_port=htons(client_infor.port_num);
addr.sin_addr.s_addr=inet_addr(client_infor.ip_addr);
if(connect(client_infor.socket_port,(struct sockaddr *)&addr,len)<0)
{
perror("connect error");
memset(commond_buffer,0,100);
memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
return FAIL;
}
memset(commond_buffer,0,100);
memcpy(commond_buffer,"150 Ok to send data.\r\n",strlen("150 Ok to send data.\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
ch=fork();
if (ch == 0)
{
while ((count=read(client_infor.socket_port,buffer,500))>0)
{
write(fp,buffer,count);
memset(buffer,0,500);
}
close(fp);
exit(0);
}
}
close(fp);
memset(commond_buffer,0,100);
memcpy(commond_buffer,"226 File receive OK.\r\n",strlen("226 File receive OK.\r\n"));
close(client_infor.socket_port);
return SCUESS;
}
int download(char *valus)
{
int fp;
fp=open(valus,O_RDONLY);
if (fp<0)
{
perror("open file to download error");
memset(commond_buffer,0,100);
memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
return FAIL;
}
lseek(fp,client_infor.file_offset,SEEK_CUR);
client_infor.file_offset=0;
struct stat file;
stat(valus,&file);
char buffer[500];
memset(buffer,0,500);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
int len=sizeof(struct sockaddr_in);
int count=0;
pid_t ch;
if (client_infor.connect_mode == PORT)
{
client_infor.socket_port=socket(AF_INET,SOCK_STREAM,0);
if (client_infor.socket_port<0)
{
perror("create port sock error");
return FAIL;
}
addr.sin_port=htons(client_infor.port_num);
addr.sin_addr.s_addr=inet_addr(client_infor.ip_addr);
if(connect(client_infor.socket_port,(struct sockaddr *)&addr,len)<0)
{
perror("connect error");
return FAIL;
}
memset(commond_buffer,0,100);
sprintf(commond_buffer,
"150 Opening %s mode data connection for %s (%d bytes).\r\n",
client_infor.trans_mode == ASCII?"ASCII":"BINARY",valus,file.st_size);
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
ch=fork();
if (ch == 0)
{
while ((count=read(fp,buffer,500))>0)
{
write(client_infor.socket_port,buffer,count);
memset(buffer,0,500);
}
close(fp);
exit(0);
}
}
close(fp);
memset(commond_buffer,0,100);
memcpy(commond_buffer,"226 Transfer complete.\r\n",strlen("226 Transfer complete.\r\n"));
close(client_infor.socket_port);
return SCUESS;
}
int reset_file_offset(char *valus)
{
memset(commond_buffer,0,100);
sprintf(commond_buffer,"350 Restarting at %s. Send STORE or RETRIEVE.\r\n",valus);
client_infor.file_offset=atol(valus);
return SCUESS;
}
int del_file(char *valus)
{
memset(commond_buffer,0,100);
if (unlink(valus)<0)
{
perror("Delete file error");
return FAIL;
}
memcpy(commond_buffer,"250 Delete operation successful.\r\n",strlen("250 Delete operation successful.\r\n"));
return SCUESS;
}
int ready_rename_file(char *valus)
{
memset(client_infor.file_old_name,0,500);
memcpy(client_infor.file_old_name,valus,strlen(valus));
memset(commond_buffer,0,100);
memcpy(commond_buffer,"350 Ready for RNTO.\r\n",strlen("350 Ready for RNTO.\r\n"));
return SCUESS;
}
int rename_file(char *valus)
{
memset(commond_buffer,0,100);
if (rename(client_infor.file_old_name,valus)<0)
{
perror("rename file error");
return FAIL;
}
memcpy(commond_buffer,"250 Rename successful.\r\n",strlen("250 Rename successful.\r\n"));
return SCUESS;
}
int make_dir(char *valus)
{
memset(commond_buffer,0,100);
if (mkdir(valus,0777)<0)
{
perror("make directory error");
return FAIL;
}
memset(pwd,0,500);
getcwd(pwd,500);
sprintf(commond_buffer,"257 \"%s/%s\" created\r\n",pwd,valus);
return SCUESS;
}
int remove_dir(char *valus)
{
memset(commond_buffer,0,100);
if (rmdir(valus)<0)
{
perror("remove directory error");
return FAIL;
}
memset(pwd,0,500);
getcwd(pwd,500);
memcpy(commond_buffer,"250 Remove directory operation successful.\r\n",strlen("250 Remove directory operation successful.\r\n"));
return SCUESS;
}
int send_file_size(char *valus)
{
memset(commond_buffer,0,100);
struct stat file;
if (stat(valus,&file)<0)
{
memcpy(commond_buffer,"550 Could not get file size.\r\n",strlen("550 Could not get file size.\r\n"));
return FAIL;
}
sprintf(commond_buffer,"213 %d\r\n",file.st_size);
return SCUESS;
}
int append_data(char *valus)
{
int fp;
fp=open(valus,O_WRONLY|O_CREAT);
if (fp<0)
{
perror("open file to upload error");
memset(commond_buffer,0,100);
memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
return FAIL;
}
lseek(fp,0,SEEK_END);
client_infor.file_offset=0;
char buffer[500];
memset(buffer,0,500);
struct sockaddr_in addr;
addr.sin_family=AF_INET;
int len=sizeof(struct sockaddr_in);
int count=0;
pid_t ch;
if (client_infor.connect_mode == PORT)
{
client_infor.socket_port=socket(AF_INET,SOCK_STREAM,0);
if (client_infor.socket_port<0)
{
perror("create port sock error");
memset(commond_buffer,0,100);
memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
return FAIL;
}
addr.sin_port=htons(client_infor.port_num);
addr.sin_addr.s_addr=inet_addr(client_infor.ip_addr);
if(connect(client_infor.socket_port,(struct sockaddr *)&addr,len)<0)
{
perror("connect error");
memset(commond_buffer,0,100);
memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
return FAIL;
}
memset(commond_buffer,0,100);
memcpy(commond_buffer,"150 Ok to send data.\r\n",strlen("150 Ok to send data.\r\n"));
write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
ch=fork();
if (ch == 0)
{
while ((count=read(client_infor.socket_port,buffer,500))>0)
{
write(fp,buffer,count);
memset(buffer,0,500);
}
close(fp);
exit(0);
}
}
close(fp);
memset(commond_buffer,0,100);
memcpy(commond_buffer,"226 File receive OK.\r\n",strlen("226 File receive OK.\r\n"));
close(client_infor.socket_port);
return SCUESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -