?? parser.c
字號:
#include"global.h"#include"parser.h"#include"controlmodule.h"//////////////////////define some usercmd's number//////////////////////////#define ERROR 0#define OPEN 1#define LS 2#define CD 3#define GET 4#define PUT 5#define quit 100/////////////////////////////////////divide///////////////////////////////////////////////////////void getcmdandarg(char *str,char *cmd,char *arg){ int tag=0;// printf("enterring getcmdandarg()\n"); while( *(str+tag)!=' ' && *(str+tag)!='\0' ){ tag++; }// printf("tag:%d\n",tag); int tmp=0; while(tmp<tag){ *cmd++=*str++; tmp++; } *(cmd)='\0'; if( *str=='\0' ){ *arg='\0'; return; printf("arg empty!\n"); } str++;// printf("before get arg\n"); while(*str!='\0'){ *arg++=*str++; } *(arg)='\0';}//////////////////////////mapping//////////////////////////////////////////////////////////////int cmdmappingnum(char *cmd){ if( strcmp(cmd,"open")==0 ) return OPEN; else if( strcmp(cmd,"quit")==0 ) return quit; else if( strcmp(cmd,"ls")==0 ) return LS; else if( strcmp(cmd,"cd")==0 ) return CD; else if( strcmp(cmd,"get")==0 ) return GET; else if( strcmp(cmd,"put")==0 ) return PUT; else return ERROR;}/////////////////the following function do paser()'s detail parse/////////////////////////void doquit(char * arg){ if(status==DISCONNECTED){ exit(0); } int firstrc=ftpcmd("QUIT",NULL); if(firstrc!=2){ printf( "quit failed, you can try again!\n"); } printf("quit\n"); exit(0);}void doopen(char *arg){ printf("open\n%s\n ",arg); strcpy(remoteaddr,arg);// char *recbuf= malloc( sizeof(char)*4096 ); struct linebuf* recbuf=inilinebuf(1024); int firstrc; //do things for connet to remote struct sockaddr_in remote; bzero( &remote , sizeof(remote) ); remote.sin_family=AF_INET; remote.sin_port=htons(21); inet_pton( AF_INET , remoteaddr , &remote.sin_addr.s_addr ); if( ( controlfd=socket(AF_INET,SOCK_STREAM,0) ) ==-1 ){ perror("socket()\n"); } if( connect( controlfd , (struct sockaddr*)&remote , sizeof(remote) )== -1 ){ perror("connect()\n"); } status=CONNECTED; readline( controlfd , recbuf ); printf("%s",recbuf); /////then enter the username////////////// printf("USER: "); getline(username); printf("%s\n",username); firstrc = ftpcmd("USER",username); switch(firstrc){ case 1: printf("get a unexpected reply, open failed!\n"); status=LOGINERROR; return; case 2: status=LOGINED; goto S; case 3: printf("PASSWORD: "); char *pass=malloc( sizeof(char)*20 ); if(pass==NULL){ perror("malloc failed!\n"); } getline(pass); firstrc=ftpcmd("PASS",pass); printf("%d\n",firstrc); break; default: printf("get a bad reply, open failed!\n"); status=LOGINERROR; return; } switch(firstrc){ case 1: printf("get a unexpected reply, open failed!\n"); status=LOGINERROR; return; case 2: status=LOGINED; goto S; case 3: //ACCT function need! printf("ACCOUNT: "); char *account=malloc( sizeof(char)*30 ); if( account==NULL ){ perror("malloc failed!\n"); } getline(account); firstrc=ftpcmd("ACCT",account); break; default: printf("get a bad reply, open failed!\n"); status=LOGINERROR; return; } switch(firstrc){ case 1: printf("get a unexpected reply, open failed!\n"); status=LOGINERROR; return; case 2: status=LOGINED; goto S; case 3: printf("get a unexpected reply, open failed!\n"); status=LOGINERROR; return; default: printf("get a bad reply, open failed!\n"); status=LOGINERROR; return; }S: firstrc=ftpcmd("SYST",NULL); ftpcmd("FEAT",NULL);//many things hasn't finished in this func! ftpcmd("PWD",NULL); firstrc=ftpcmd("TYPE","A"); if( firstrc!=2 ){ printf( "negotiation for the transmition failed!\n" ); exit(0); }}void dolist(char *arg){ int firstrc=ftpcmd("PASV",NULL); if( firstrc!=2 ){ printf( "request for passive mode failed! list maybe wrong\n"); } ftpcmd("LIST",arg);}void docd(char *arg){ ftpcmd("CWD",arg);}void doget(char *arg){ ftpcmd("TYPE","I"); ftpcmd("PASV",NULL); printf("%s\n",arg); ftpcmd("RETR",arg);}void doput(char * arg){ ftpcmd("TYPE","I"); ftpcmd("PASV",NULL); printf("%s\n",arg); ftpcmd("STOR",arg);} void doerror(char *arg){ printf("the user command you have inputted doesn't exit!\n");}///////////////////////////////////////////main paser////////////////////////////////////////////////void parser(char *str){ char *cmd=malloc( sizeof(char)*10 ); char *arg=malloc( sizeof(char)*100 ); if( cmd==NULL || arg==NULL ){ perror("malloc failed!"); } getcmdandarg( str , cmd , arg ); printf( "cmd:%s,arg:%s\n" , cmd , arg ); int num=cmdmappingnum(cmd); printf("num:%d\n",num); switch(num){ case OPEN: doopen(arg); break; case quit: doquit(arg); break; case LS: dolist(arg); break; case CD: docd(arg); break; case GET: doget(arg); break; case PUT: doput(arg); break; default: doerror(arg); } printf("before free(cmd)\n"); free(cmd); printf("after free(cmd)\n"); free(arg); printf("after free(arg)\n");}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -