?? controlmodule.c
字號:
#include"global.h"#include"controlmodule.h"#include"datatransmitmodule.h"///////////////////////////ftp command////////////////////#define ERROR 0#define USER 1#define PASS 2#define SYST 3#define FEAT 4#define PWD 5#define TYPE 6#define PASV 7#define LIST 8#define CWD 9#define RETR 10#define STOR 11#define ACCT 12#define QUIT 13////////////////////map strFTPcmd to intFTPcmd////////////////int ftpcmdmapping( char * cmd ){ if( strcmp( cmd , "USER") ==0 ){ return USER; }else if( strcmp( cmd , "PASS" )==0 ){ return PASS; }else if( strcmp( cmd , "SYST" )==0 ){ return SYST; }else if( strcmp( cmd , "FEAT" )==0){ return FEAT; }else if( strcmp( cmd , "PWD" )==0){ return PWD; }else if( strcmp( cmd , "TYPE")==0 ){ return TYPE; }else if( strcmp( cmd , "PASV" )==0 ){ return PASV; }else if( strcmp( cmd , "LIST" )==0 ){ return LIST; }else if( strcmp( cmd , "CWD" )==0 ){ return CWD; }else if( strcmp( cmd , "RETR" )==0 ){ return RETR; }else if( strcmp( cmd , "STOR" )==0 ){ return STOR; }else if( strcmp( cmd , "ACCT" )==0 ){ return ACCT; }else if( strcmp( cmd , "QUIT" )==0 ){ return QUIT; } return ERROR;}int addcrlf(char *str){//return the bytes of the already buf. int c=0; while( *str!='\0' ){ str++; c++; } *(str++)='\15'; *(str++)='\12'; *str='\0'; c+=2; return c;}int getFirstReplyCode(char *str){ return (int)*str-48;}int getPortnum(char *str){ int c=0; char * p=str; int n1=0,n2=0; while(c!=4){ if(*p==','){ c++; } p++; } while( (int)*p>47 && (int)*p<58 ){ n1+=(int)*p-48; n1*=10; p++; } n1/=10; p++; while( (int)*p>47 && (int)*p<58 ){ n2+=(int)*p-48; n2*=10; p++; } n2/=10; printf("n1=%d,n2=%d\n",n1,n2); return n1*256+n2;}///////////////////the following function do all the really job for ftp request and response//////////int ftpuser( char * arg){// char *cmdbuf =malloc( sizeof(char)*100 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"USER "); strcpy(cmdbuf->buf+5,arg); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpuser()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf); int n= getFirstReplyCode(cmdbuf->buf); freelinebuf(cmdbuf); return n;}int ftppassword( char * arg){// char *cmdbuf =malloc( sizeof(char)*2048 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"PASS "); strcpy(cmdbuf->buf+5,arg); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftppassword()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); freelinebuf(cmdbuf); return n;}int ftpsystem(char *arg){// char *cmdbuf =malloc( sizeof(char)*50 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"SYST"); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpsystem()->write()\n"); } readline(controlfd,cmdbuf); strcpy(remoteostype,cmdbuf->buf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); free(cmdbuf); return n;}int ftpfeature(char *arg){// char *cmdbuf =malloc( sizeof(char)*100 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"FEAT"); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpfeature()->write()\n"); } readline(controlfd,cmdbuf); printf("%s",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); freelinebuf(cmdbuf); return n;}int ftpprintworkingdirectory(char * arg){// char *cmdbuf =malloc( sizeof(char)*100 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"PWD"); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpprintworkingdirectory()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); char *ptr1=cmdbuf->buf; char *ptr2; while( *ptr1!='"' ){ ptr1++; } ptr2=++ptr1; while( *ptr1!='"' ){ ptr1++; } *ptr1='\0'; strcpy( remotecwd , ptr2 );// printf( "%s\n" , ptr2 ); freelinebuf(cmdbuf); return n;}int ftptype(char *arg){// char *cmdbuf =malloc( sizeof(char)*500 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"TYPE "); strcpy(cmdbuf->buf+5,arg); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftptype()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); if( n==2 ){ *transmittype=*arg; } freelinebuf(cmdbuf); return n;}int ftppassive(char * arg){// char *cmdbuf =malloc( sizeof(char)*1000 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); } struct sockaddr_in remote; bzero( &remote , sizeof(struct sockaddr_in) ); remote.sin_family=AF_INET; inet_pton( AF_INET , remoteaddr , &remote.sin_addr.s_addr ); strcpy(cmdbuf->buf,"PASV"); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftppassive()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int port=getPortnum(cmdbuf->buf); remote.sin_port=htons(port); datafd=socket( AF_INET , SOCK_STREAM , 0 ); if( datafd==-1){ perror("ftppassive()->socket()\n"); } if( connect( datafd , (struct sockaddr*)&remote , sizeof(remote) ) ==-1 ){ perror("ftppassive()->connect()\n"); } int n=getFirstReplyCode(cmdbuf->buf); printf("free(cmdbuf) in ftppassive()!\n"); freelinebuf(cmdbuf); return n;}int ftplist(char * arg){// char *cmdbuf =malloc( sizeof(char)*500 ); struct linebuf* cmdbuf=inilinebuf(100); if( cmdbuf==NULL){ perror("malloc failed!\n"); }// char *listbuf; struct linebuf* listbuf; if(*arg!='\0'){ strcpy(cmdbuf->buf,"LIST "); strcpy(cmdbuf->buf+5,arg); }else{ strcpy(cmdbuf->buf,"LIST"); } int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftplist()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); if(n==1){// listbuf=malloc( sizeof(char)*3000 ); listbuf=inilinebuf(4096); if( listbuf==NULL ){ perror("malloc failed!\n"); } if( readlist( datafd , listbuf ) <=0 ){ perror("ftplist()->readlist()!"); } printf("%s\n",listbuf->buf); close(datafd); readline(controlfd,cmdbuf); freelinebuf(listbuf); printf("%s\n",cmdbuf->buf); freelinebuf(cmdbuf); return n; } freelinebuf(cmdbuf); return n;}int ftpchangeworkingdirectory(char * arg){// char *cmdbuf =malloc( sizeof(char)*50 ); struct linebuf* cmdbuf=inilinebuf(50); if( cmdbuf==NULL ){ perror("malloc failed!\n"); }// char *listbuf; struct linebuf* listbuf; if(*arg!='\0'){ strcpy(cmdbuf->buf,"CWD "); strcpy(cmdbuf->buf+4,arg); }else{ strcpy(cmdbuf->buf,"CWD"); } int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpchangingworkingdirectory()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); freelinebuf(cmdbuf); return n;}int ftpretrive(char *arg){ printf("enter ftpretrive()\n");// char *cmdbuf =malloc( sizeof(char)*200 ); struct linebuf* cmdbuf=inilinebuf(200); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"RETR "); strcpy(cmdbuf->buf+5,arg); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpretrive()->write()\n"); } int n;R: readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); n=getFirstReplyCode(cmdbuf->buf); switch(n){ case 1: readdata(datafd,arg); close(datafd); goto R; case 2: break; default: return n; } printf("before free()\n"); freelinebuf(cmdbuf); printf("after free()\n"); return n;}int ftpstore(char * arg){ printf("enter ftpstore()\n");// char *cmdbuf =malloc( sizeof(char)*200 ); struct linebuf* cmdbuf=inilinebuf(200); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"STOR "); strcpy(cmdbuf->buf+5,arg); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpstore()->write()\n"); }T: readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); switch(n){ case 1: writedata(datafd,arg); close(datafd); goto T; case 2: break; default: return n; } freelinebuf(cmdbuf); return n;}int ftpaccount(char *arg){// char *cmdbuf =malloc( sizeof(char)*500 ); struct linebuf* cmdbuf=inilinebuf(500); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"ACCT "); strcpy(cmdbuf->buf+5,arg); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftpaccount()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); freelinebuf(cmdbuf); return n;}int ftpquit(char *arg){// char *cmdbuf =malloc( sizeof(char)*50 ); struct linebuf* cmdbuf=inilinebuf(50); if( cmdbuf==NULL){ perror("malloc failed!\n"); } strcpy(cmdbuf->buf,"QUIT"); int count=addcrlf(cmdbuf->buf); printf("ftpcmd:"); for(int i=0;i<count;i++){ printf("%d ",*(cmdbuf->buf+i) ); } if( write(controlfd,cmdbuf->buf,count)== -1){ perror("ftptquit()->write()\n"); } readline(controlfd,cmdbuf); printf("%s\n",cmdbuf->buf); int n=getFirstReplyCode(cmdbuf->buf); freelinebuf(cmdbuf); return n;} int ftperror( char *arg){ printf("giving a wrong ftpcmd!\n"); exit(0);}///////////////////the global function in the controling module///////////////////////////////////////int ftpcmd(char *cmd,char *arg){ int num=ftpcmdmapping(cmd); switch(num){ case USER: return ftpuser(arg); case PASS: return ftppassword(arg); case SYST: printf("enter SYST\n"); return ftpsystem(arg); case FEAT: printf("enter FEAT\n"); return ftpfeature(arg); case PWD: return ftpprintworkingdirectory(arg); case TYPE: return ftptype(arg); case PASV: return ftppassive(arg); case LIST: return ftplist(arg); case CWD: return ftpchangeworkingdirectory(arg); case RETR: return ftpretrive(arg); case STOR: return ftpstore(arg); case ACCT: return ftpaccount(arg); case QUIT: return ftpquit(arg); default: ftperror(arg); } return ERROR;//never goto here!}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -