📄 explaincmd.c
字号:
#include "explaincmd.h"
#include "global.h"
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <net/route.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <crypt.h>
char ip_str[18]="";
int port;
int data_port_sfd;
int data_pasv_sfd;
int tran_type=1;
int file_type=1;
char oldname[100]="";
char newname[100]="";
off_t fileseek;
char anypath[100]="";
int isany=0;
int ExpCmd(int sockfd)
{
char Recv_cmd[1024]={0};
char cmd[1024]={0};
char lastcmd[1024]={0};
Read(sockfd,Recv_cmd,1024);
Cutcmd(Recv_cmd,cmd,lastcmd);
if(strcmp(cmd,"QUIT")==0)
{
Write(sockfd,"221 Goodbye.\r\n",strlen("221 Goodbye.\r\n"));
return -1;
}
else if(strcmp(cmd,"USER")==0)
{
if(islogin==1)
{
Write(sockfd,"500 Unknown command.\r\n",strlen("500 Unknown command.\r\n"));
return 0;
}
else
{
GetUsr(lastcmd);
Write(sockfd,"331 Please specify the password\r\n",strlen("331 Please specify the password\r\n"));
return 0;
}
}
else if(strcmp(cmd,"RNFR")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Storfilename(oldname,lastcmd);
Write(sockfd,"350 Ready for RNTO.\r\n",strlen("350 Ready for RNTO.\r\n"));
return 0;
}
else if(strcmp(cmd,"SYST")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Write(sockfd,"215 UNIX Type: L8\r\n",strlen("215 UNIX Type: L8\r\n"));
return 0;
}
else if(strcmp(cmd,"REST")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Dorest(sockfd,lastcmd);
return 0;
}
else if(strcmp(cmd,"NOOP")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Write(sockfd,"200 NOOP ok.\r\n",strlen("200 NOOP ok.\r\n"));
return 0;
}
else if(strcmp(cmd,"HELP")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
char help[]="214- The following commands are recognized (* => unimplemented).\r\n\
USER PORT RETR DELE SITE CDUP\r\n\
PASS PASV STOR REST CWD STAT\r\n\
RMD TYPE APPE HELP RNTO LIST\r\n\
NOOP PWD SIZE QUIT SYST NLST\r\n\
MKD MDTM RNFR XPWD XCWD XRMD\r\n\
XMKD\r\n
214 Direct comments or bugs to jackleeforce@sina.com.\r\n";
Write(sockfd,help,strlen(help));
return 0;
}
else if(strcmp(cmd,"RNTO")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Storfilename(newname,lastcmd);
Renamefile(sockfd,oldname,newname);
return 0;
}
else if(strcmp(cmd,"TYPE")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
ChangeFileType(sockfd,lastcmd);
return 0;
}
else if(strcmp(cmd,"PASS")==0)
{
if(islogin==1)
{
Write(sockfd,"500 Unknown command.\r\n",strlen("500 Unknown command.\r\n"));
return 0;
}
else
{
GetPwd(sockfd,lastcmd);
return 0;
}
}
else if(strcmp(cmd,"PASV")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
else
{
DoPasv(sockfd);
return 0;
}
}
else if(strcmp(cmd,"PORT")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
GetIpPort(sockfd,lastcmd);
return 0;
}
else if(strcmp(cmd,"MKD")==0 || strcmp(cmd,"XMKD")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Mkdir(sockfd,lastcmd);
return 0;
}
else if(strcmp(cmd,"RMD")==0 || strcmp(cmd,"XRMD")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Rmdir(sockfd,lastcmd);
return 0;
}
else if(strcmp(cmd,"DELE")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
DeleteFile(sockfd,lastcmd);
return 0;
}
else if(strcmp(cmd,"RETR")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
if(tran_type==2)
SendFilePasv(sockfd,lastcmd);
else if(tran_type==1)
SendFilePort(sockfd,lastcmd);
fileseek=0;
return 0;
}
else if(strcmp(cmd,"CDUP")==0)
{
int flag=0;
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
flag=CDUP(sockfd);
if(0==flag)
Write(sockfd,"250 Directory successfully changed.\r\n",strlen("250 Directory successfully changed.\r\n"));
else
Write(sockfd,"500 Directory changed failed.\r\n",strlen("500 Directory changed failed.\r\n"));
return 0;
}
else if(strcmp(cmd,"STOR")==0 || strcmp(cmd,"APPE")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
if(tran_type==2)
RecvFilePasv(sockfd,lastcmd);
else if(tran_type==1)
RecvFilePort(sockfd,lastcmd);
fileseek=0;
return 0;
}
else if(strcmp(cmd,"CWD")==0 || strcmp(cmd,"XCWD")==0)
{
int flag=0;
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
if(isany==1)
{
strcpy(anypath,lastcmd);
}
flag=ChangeDir(sockfd,lastcmd);
if(0==flag)
Write(sockfd,"250 Directory successfully changed.\r\n",strlen("250 Directory successfully changed.\r\n"));
else
Write(sockfd,"500 Directory changed failed.\r\n",strlen("500 Directory changed failed.\r\n"));
return 0;
}
else if(strcmp(cmd,"SIZE")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
int flag=0;
struct stat filestat;
char tmp[100]="";
flag=Getfilesize(lastcmd,&filestat);
if(flag==0)
{
sprintf(tmp,"213 %ld\r\n",filestat.st_size);
Write(sockfd,tmp,strlen(tmp));
}
else
Write(sockfd,"550 Could not get file size.\r\n",strlen("550 Could not get file size.\r\n"));
return 0;
}
else if(strcmp(cmd,"MDTM")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
int flag=0;
struct stat filestat;
char tmp[100]="";
flag=Getfilesize(lastcmd,&filestat);
if(flag==-1)
{
Write(sockfd,"550 Could not get file modification time.\r\n",strlen("550 Could not get file modification time.\r\n"));
}
else
Write(sockfd,"213 20070817083515\r\n",strlen("213 20070817083515\r\n"));
return 0;
}
else if(strcmp(cmd,"PWD")==0 || strcmp(cmd,"XPWD")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
char cur_path[100]="";
char tmp[100]="";
getcwd(cur_path,sizeof(cur_path));
if(isany==1)
{
if(strcmp(cur_path,"/var/ftp")==0)
strcpy(cur_path,"/");
/*else
{
strcpy(cur_path,"/");
strcat(cur_path,anypath);
}*/
}
sprintf(tmp,"257 \"%s\"\r\n",cur_path);
Write(sockfd,tmp,strlen(tmp));
return 0;
}
else if(strcmp(cmd,"SITE")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Write(sockfd,"501 SITE option not supported.\r\n",strlen("501 SITE option not supported.\r\n"));
return 0;
}
else if(strcmp(cmd,"STAT")==0)
{
char tmp[100]="";
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
Write(sockfd,"211 Connection Normal.\r\n",strlen("211 Connection Normal.\r\n"));
return 0;
}
else if(strcmp(cmd,"NLST")==0 || strcmp(cmd,"LIST")==0)
{
if(islogin==0)
{
Write(sockfd,"530 Please login with USER and PASS.\r\n",strlen("530 Please login with USER and PASS.\r\n"));
return 0;
}
ExpNLST(sockfd);
return 0;
}
else
{
Write(sockfd,"500 Unknown command.\r\n",strlen("500 Unknown command.\r\n"));
return 0;
}
}
void Cutcmd(char *ful_cmd,char *cmd,char *lastcmd)
{
char tmp[100]={0};
int i=0;
int j=0;
while(ful_cmd[j]!=' ' && ful_cmd[j]!='\r')
{
tmp[i]=ful_cmd[j];
i++;
j++;
}
if(ful_cmd[j]=='\r')
{
strcpy(cmd,ful_cmd);
cmd[j]='\0';
return;
}
tmp[i]='\0';
strcpy(cmd,tmp);
memset(tmp,0,sizeof(tmp));
i=0;
j++;
while(ful_cmd[j]!='\r')
{
tmp[i]=ful_cmd[j];
i++;
j++;
}
tmp[i]='\0';
strcpy(lastcmd,tmp);
return;
}
void GetIpPort(int sockfd,char *lastcmd)
{
char ip_tmp[18]="";
char port_hi[5]="";
char port_low[5]="";
int i=0;
int j=0;
int flag=0;
for(;lastcmd[i]!='\0';i++)
{
if(lastcmd[i]==',')
{
flag++;
if(flag==4)
{
i++;
break;
}
ip_tmp[j]='.';
j++;
}
else
{
ip_tmp[j]=lastcmd[i];
j++;
}
}
ip_tmp[j]='\0';
strcpy(ip_str,ip_tmp);
j=0;
for(;lastcmd[i]!='\0';i++)
{
if(lastcmd[i]!=',')
{
port_hi[j]=lastcmd[i];
j++;
}
else
{
port_hi[j]='\0';
i++;
break;
}
}
j=0;
for(;lastcmd[i]!='\0';i++)
{
port_low[j]=lastcmd[i];
j++;
}
port_low[j]='\0';
port=atoi(port_hi)*256+atoi(port_low);
tran_type=1;
Write(sockfd,"200 PORT command successful. Consider using PASV.\r\n",strlen("200 PORT command successful. Consider using PASV.\r\n"));
}
void ExpNLST(int sockfd)
{
char buf[BUFSIZ+1]={0};
int pasvfd;
if(tran_type==1)
{
struct sockaddr_in addr;
data_port_sfd=CreateSocket(AF_INET, SOCK_STREAM, 0);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(20);
Bind(data_port_sfd,&addr,sizeof(addr));
ConnectPort(port,ip_str);
/*
if(GetList(buf,sizeof(buf))>=0)
{
Write(sockfd,"150 Here comes the directory listing.\r\n",strlen("150 Here comes the directory listing.\r\n"));
Send(data_port_sfd,buf,strlen(buf),0);
}
*/
Write(sockfd,"150 Here comes the directory listing.\r\n",strlen("150 Here comes the directory listing.\r\n"));
GetList(buf,sizeof(buf),data_port_sfd);
}
else
{
pasvfd=Accept(data_pasv_sfd,(struct sockaddr *)NULL,(socklen_t *)NULL);
/*if(GetList(buf,sizeof(buf))>=0)
{*/
Write(sockfd,"150 Here comes the directory listing.\r\n",strlen("150 Here comes the directory listing.\r\n"));
GetList(buf,sizeof(buf),pasvfd);
//}
}
Write(sockfd,"226 Directory send OK.\r\n",strlen("226 Directory send OK.\r\n"));
close(pasvfd);
close(data_pasv_sfd);
close(data_port_sfd);
}
void ConnectPort(int port,char *ip)
{
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
inet_pton(AF_INET,ip,&addr.sin_addr);
Connect(data_port_sfd,(const struct sockaddr *)&addr,sizeof(addr));
}
int GetList(char *buf,int len,int sockfd)
{
DIR *dir;
struct dirent *ent;
int off = 0;
if ((dir = opendir(".")) ==NULL)
{
return -1;
}
memset(buf,'\0',sizeof(buf));
while ((ent = readdir(dir)) != NULL)
{
char *filename = ent->d_name;
struct stat st;
char mode[] = "----------";
struct passwd *pwd_stu;
struct group *grp;
struct tm *ptm;
char timebuf[BUFSIZ];
int timelen;
if (strcmp(filename, ".") == 0 ||strcmp(filename, "..") == 0)
{
continue;
}
if (stat(filename, &st) < 0)
{
closedir(dir);
return -1;
}
switch (st.st_mode & S_IFMT)
{
case S_IFREG: mode[0] = '-'; break;
case S_IFDIR: mode[0] = 'd'; break;
case S_IFLNK: mode[0] = 'l'; break;
case S_IFIFO: mode[0] = 'p'; break;
case S_IFSOCK: mode[0] = 's'; break;
case S_IFCHR: mode[0] = 'c'; break;
case S_IFBLK: mode[0] = 'b'; break;
}
if (st.st_mode & S_IRUSR)
mode[1] = 'r';
if (st.st_mode & S_IWUSR)
mode[2] = 'w';
if (st.st_mode & S_IXUSR)
mode[3] = 'x';
if (st.st_mode & S_IRGRP)
mode[4] = 'r';
if (st.st_mode & S_IWGRP)
mode[5] = 'w';
if (st.st_mode & S_IXGRP)
mode[6] = 'x';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -