#include "ftpcmd.h" #include "ftp32api.h" #include "cmdline.h" #include "common.h" #include "stringq.h" #include "url.h" #ifdef WIN32 #include /* mkdir */ #else #include #include #endif #include "dlg.h" extern HINSTANCE _hInst; static int do_add(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc,STATUSDIALOG *sd) { int retcode = 0; int ret; char dirname[1000]=""; while(argc){ int c = getlastchar(*argv); if(c=='/' || c=='\\'){ strcpy(dirname,*argv); #ifdef WIN32 mkdir(dirname); #else mkdir(dirname,0777); #endif }else{ STRINGQ_printf(stringq,"Write begin [%s]\n",*argv); StatusDialogPrintf(sd,"Write begin [%s]\r\n",*argv); /*ret = FtpAdd(harc,NULL,*argv,0); */ ret = FtpAdd(harc,dirname,*argv,0); if(ret <= 0){ STRINGQ_printf(stringq,"Error: Can't FtpAdd(%d,%s,%s,%d)\n",harc,*argv,NULL,0); retcode = ERROR_CANNOT_WRITE; break; } STRINGQ_printf(stringq,"Write end [%s]\n",*argv); StatusDialogPrintf(sd,"Write end [%s]\r\n",*argv); } argc--; argv++; } return retcode; } static int do_extract(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc,STATUSDIALOG *sd) { int retcode = 0; int ret; char dirname[1000]=""; while(argc){ int c = getlastchar(*argv); if(c=='/' || c=='\\'){ strcpy(dirname,*argv); #ifdef WIN32 mkdir(dirname); #else mkdir(dirname,0777); #endif }else{ STRINGQ_printf(stringq,"Read begin [%s]\n",*argv); StatusDialogPrintf(sd,"Read begin [%s]\r\n",*argv); /*ret = FtpExtract(harc,*argv,NULL,0);*/ ret = FtpExtract(harc,*argv,dirname,0); if(ret <= 0){ STRINGQ_printf(stringq,"Error: Can't FtpExtract(%d,%s,%s,%d)\n",harc,*argv,NULL,0); retcode = ERROR_NOT_FIND_ARC_FILE; break; } STRINGQ_printf(stringq,"Read end [%s]\n",*argv); StatusDialogPrintf(sd,"Read end [%s]\r\n",*argv); } argc--; argv++; } return retcode; } static GetTimeFromARCDateTime(DWORD wDate,DWORD wTime) { time_t ti; struct tm tm; tm.tm_year = ( ((wDate>>9) & 0x7f)+1980) - 1900; tm.tm_mon = ((wDate>>5) & 0x0f) - 1; tm.tm_mday = ((wDate>>0) & 0x1f) ; tm.tm_hour = ((wTime>>11) & 0x1f) ; tm.tm_min = ((wTime>>5) & 0x3f) ; tm.tm_sec = ((wTime>>0) & 0x1f) * 2; ti = timelocal(&tm); return ti; } static int do_list(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc) { int retcode = 0; int ret; INDIVIDUALINFO info; struct tm tm, *tmptr; time_t ti; int filenum=0; WORD wdate,wtime; STRINGQ_printf(stringq," Name Original Packed Ratio Date Time Attr Method CRC-32\n"); STRINGQ_printf(stringq,"-------------- -------- -------- ------ ---------- -------- ---- -------- --------\n"); ret = FtpFindFirst(harc,"",&info); while(ret==0){ ti = GetTimeFromARCDateTime(info.wDate,info.wTime); tm = *(localtime(&ti)); STRINGQ_printf(stringq,"%14s %8d %8d %6.1f %04d-%02d-%02d %02d:%02d:%02d %4s %7s %08x\n" ,info.szFileName ,info.dwOriginalSize ,info.dwCompressedSize ,info.wRatio / 10.0 ,tm.tm_year+1900 ,tm.tm_mon+1 ,tm.tm_mday ,tm.tm_hour ,tm.tm_min ,tm.tm_sec ,info.szAttribute ,info.szMode ,info.dwCRC); filenum++; ret = FtpFindNext(harc,&info); } STRINGQ_printf(stringq,"-------------- -------- -------- ------ ---------- -------- ---- -------- --------\n"); wdate = FtpGetArcDate(harc); wtime = FtpGetArcTime(harc); ti = GetTimeFromARCDateTime(wdate,wtime); tmptr = localtime(&ti); tm = *tmptr; STRINGQ_printf(stringq," %3d files %8d %8d %6.1f %04d-%02d-%02d %02d:%02d:%02d\n" /* " %4s %7s %08x\n"*/ ,filenum ,FtpGetArcOriginalSize(harc) ,FtpGetArcCompressedSize(harc) ,FtpGetArcRatio(harc) / 10.0 ,tm.tm_year+1900 ,tm.tm_mon+1 ,tm.tm_mday ,tm.tm_hour ,tm.tm_min ,tm.tm_sec /*,info.szAttribute ,info.szMode ,info.dwCRC*/); return retcode; } static int do_check(int argc,char **argv,HWND hwnd,STRINGQ *stringq,char *url) { int ret; int retcode=0; ret = FtpCheckArchive(url,0); if(ret==0){ STRINGQ_printf(stringq,"check [%s] ... NG\n",url); retcode = ERROR_FILE_STYLE; }else{ STRINGQ_printf(stringq,"check [%s] ... OK\n",url); } return retcode; } static int do_print(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc) { int retcode = 0; int ret; char dirname[1000]=""; char buff[4096]; int nr,nw; while(argc){ if(strrchr(*argv,'/') || strrchr(*argv,'\\')){ strcpy(dirname,*argv); }else{ ret = FtpOpenFile(harc,*argv,"rb",0); if(ret==-1){ STRINGQ_printf(stringq,"Error: Can't FtpOpenFile(%d,%s,%s,%d)\n",harc,*argv,"rb",0); return ERROR_NOT_FIND_ARC_FILE; } while(1){ nr = FtpRead(harc,buff,4096); if(nr<=0){break;} nw = STRINGQ_write(stringq,buff,nr); if(nw<=0){break;} } FtpCloseFile(harc); } argc--; argv++; } return retcode; } static int do_mkdir(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc) { int ret; while(argc){ STRINGQ_printf(stringq,"Making Directory [%s]\n",*argv); ret = FtpMkDir(harc,*argv,0); if(ret <=0){ STRINGQ_printf(stringq,"Error: Can't MkDir(%d,%s,%s,%d)\n",harc,*argv,NULL,0); return ERROR_CANNOT_WRITE; } argc--;argv++; } return 0; } static int do_rmdir(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc) { int ret; while(argc){ STRINGQ_printf(stringq,"Making Directory [%s]\n",*argv); ret = FtpRmDir(harc,*argv,0); if(ret <=0){ STRINGQ_printf(stringq,"Error: Can't MkDir(%d,%s,%s,%d)\n",harc,*argv,NULL,0); return ERROR_CANNOT_WRITE; } argc--;argv++; } return 0; } static int do_move(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc) { int ret; while(argc){ STRINGQ_printf(stringq,"Making Directory [%s]\n",*argv); ret = FtpMkDir(harc,*argv,0); if(ret <= 0){ STRINGQ_printf(stringq,"Error: Can't MkDir(%d,%s,%s,%d)\n",harc,*argv,NULL,0); return ERROR_CANNOT_WRITE; } argc--;argv++; } return 0; } static int do_delete(int argc,char **argv,HWND hwnd,STRINGQ *stringq,HARC harc) { int ret; while(argc){ STRINGQ_printf(stringq,"Making Directory [%s]\n",*argv); ret = FtpMkDir(harc,*argv,0); if(ret <= 0){ STRINGQ_printf(stringq,"Error: Can't MkDir(%d,%s,%s,%d)\n",harc,*argv,NULL,0); return ERROR_CANNOT_WRITE; } argc--;argv++; } return 0; } static int do_config(int argc,char **argv,HWND hwnd,STRINGQ *stringq) { int ret; int retcode=0; ret = FtpConfigDialog(hwnd,"",0); if(ret==0){ STRINGQ_printf(stringq,"ConfigDialog ... Cancel\n"); }else{ STRINGQ_printf(stringq,"ConfigDialog ... OK\n"); } return retcode; } void usage(STRINGQ *b) { STRINGQ_printf(b,"Usage: ftp32 -[a|x|t|p|l] ftp://[user[:pass]@]host[:port]/path [files...]\n"); STRINGQ_printf(b," ftp32 --mkdir|--rmdir|--delete|--move|--config ftp://[user:pass@]host[:port]/path [files...]\n"); STRINGQ_printf(b," ftp://[user[:pass]@]host[:port]/path [files...]\n"); STRINGQ_printf(b," ftp32 --config\n"); } static int CALLBACK cancelcallback(void *param) { #ifdef WIN32 int ret; HARC* harcp = (HARC*)param; HARC harc; if(harcp==NULL){ MessageBox("(cancelcallback)Warning: callback parameter(HARC*) is NULL.","FTP32.DLL",0,0); return 1; } harc = *harcp; if(harc==NULL){ MessageBox("(cancelcallback)Warning: HARC is NULL.","FTP32.DLL",0,0); return 1; } FtpCancel(harc,0); /*ret = MessageBox("Now,I can't cancel,correctly. \r\nI try to do 'WSACleanup():(Close socket library)' OK?","FTP32.DLL",0,MB_OKCANCEL); if(ret==IDOK){ WSACleanup(); }*/ return 1; #else return 1; #endif } static int WINAPI callbackmsgfunc(char *msg,void *param) { STATUSDIALOG *sd = (STATUSDIALOG*)param; StatusDialogPuts(sd,msg); return 1; } int Ftp_Itr(const HWND hwnd,LPCSTR szCmdLine,LPSTR szOutput,const DWORD wSize) { int argc; char **argv=NULL,**argv_for_free=NULL; int errcode = 0; enum {FTP32CMD_MKDIR = 256,FTP32CMD_RMDIR,FTP32CMD_MOVE,FTP32CMD_DELETE}; char command[1000]="\0\0"; /* 'a','x','t','p','l',"mkdir","rmdir",... */ char url[1000]; STRINGQ *stringq = NULL; int flag_no_dialog=0; /* not implemented */ int flag_quiet=0; STATUSDIALOG *statusdialog=NULL; char puburl[1000]; char filenamebuf[1000]; int dataconnectionmode=-1; int open_mode=0; /* make buffer object for output */ stringq = STRINGQ_open(szOutput,wSize); if((argv=split_cmdline_with_response((char *)szCmdLine))==NULL){ usage(stringq); STRINGQ_printf(stringq,"Error: Commandline Parse failed [%s]\n",szCmdLine); errcode =ERROR_COMMAND_NAME; goto endlabel; } argv_for_free=argv; argc=ptrarraylen(argv); while(argc){ char *argp = *argv; if(*argp == '-'){ argp++; if(*argp=='-'){ argp++; if(*argp=='\0'){break;} if(strcmp(argp,"long-option-test")==0){ STRINGQ_printf(stringq,"longoptiontest...ok!\n",argp); }else if(strcmp(argp,"dataconnectionmode")==0 && argc>1){ argv++;argc--; dataconnectionmode = atoi(*argv); }else{ strcpy(command,argp); } argp += strlen(argp); /* goto next argument */ } while(*argp){ if(*argp=='a'){ *command = 'a'; }else if(*argp=='x'){ *command = 'x'; }else if(*argp=='l'){ *command = 'l'; }else if(*argp=='t'){ *command = 't'; }else if(*argp=='p'){ *command = 'p'; }else if(*argp=='i'){ flag_no_dialog = 1; }else if(*argp=='q'){ flag_quiet = 1; }else if(*argp=='+'){ open_mode |= M_INIT_FILE_USE; }else{ usage(stringq); STRINGQ_printf(stringq,"Error: Illegal command [%c]\n",*argp); errcode = ERROR_COMMAND_NAME; goto endlabel; } argp++; } }else{ break; } argc--; argv++; } /* check command existance */ if(*command == '\0'){ STRINGQ_printf(stringq,"Error: Can't find command.\n"); usage(stringq); errcode = ERROR_COMMAND_NAME; goto endlabel; } /* Config Dialog needn't URL */ if(strcmp(command,"config")==0){ errcode = do_config(argc,argv,hwnd,stringq); goto endlabel; } if(argc<=0){ STRINGQ_printf(stringq,"Error: Can't find URL.\n"); usage(stringq);errcode = ERROR_COMMAND_NAME;goto endlabel; } strcpy(url,*argv); if(!isurl(url)){ STRINGQ_printf(stringq,"Error: Illegal URL syntax [%s].\n",url); usage(stringq);errcode = ERROR_COMMAND_NAME;goto endlabel; } argv++,argc--; /* If there is no filename for command "a" or "x", make argument from URL */ /* ex) URL: ftp://ftp.iij.ad.jp/pub/RFC/rfc2000.txt ,argv=NULL,argc=0 => URL: ftp://ftp.iij.ad.jp/pub/RFC/ ,argv="rfc2000.txt" ,argc=1 */ if((strcmp(command,"a")==0 || strcmp(command,"x")==0 || strcmp(command,"p")==0) && argc == 0){ char proto[1000],user[1000],pass[1000],host[1000],path[1000];int port; char *ptr; parse_url(url,proto,user,pass,host,&port,path); if(strcmp(path,"/")==0){ STRINGQ_printf(stringq,"Error: Can't find remote filename.\n",url); usage(stringq);errcode = ERROR_COMMAND_NAME;goto endlabel; } ptr=strrchr(path,'/'); /* always match */ strcpy(filenamebuf,ptr+1); *argv = filenamebuf;argc=1; *(ptr+1) = '\0'; build_url(url,proto,user,pass,host,port,path); } public_url(puburl,url); /* delete password field for security */ { HARC harc; if(!flag_no_dialog){ statusdialog = OpenStatusDialog(_hInst,hwnd,cancelcallback,&harc); } if(strcmp(command,"t")==0){ errcode = do_check(argc,argv,hwnd,stringq,url); }else{ if(!flag_quiet){ if(strcmp(command,"p")!=0){ STRINGQ_printf(stringq,"Opening URL[%s]\n",puburl); } StatusDialogPrintf(statusdialog,"Opening URL[%s]\r\n",puburl); } harc = FtpOpenArchive(hwnd,url,open_mode); if(harc==NULL){ STRINGQ_printf(stringq,"Error: Can't FtpOpenArchive(%d,%s,%d)\n",hwnd,url,0); goto endlabel; } FtpSetCallbackMsgFunc(harc,callbackmsgfunc,(void*)statusdialog); if(dataconnectionmode != -1){ FtpSetDataConnectionMode(harc,dataconnectionmode); } if(strcmp(command,"a")==0){ errcode = do_add(argc,argv,hwnd,stringq,harc,statusdialog); }else if(strcmp(command,"x")==0){ errcode = do_extract(argc,argv,hwnd,stringq,harc,statusdialog); }else if(strcmp(command,"l")==0){ errcode = do_list(argc,argv,hwnd,stringq,harc); }else if(strcmp(command,"p")==0){ errcode = do_print(argc,argv,hwnd,stringq,harc); }else if(strcmp(command,"mkdir")==0){ errcode = do_mkdir(argc,argv,hwnd,stringq,harc); }else if(strcmp(command,"rmdir")==0){ errcode = do_rmdir(argc,argv,hwnd,stringq,harc); }else if(strcmp(command,"move")==0){ errcode = do_move(argc,argv,hwnd,stringq,harc); }else if(strcmp(command,"delete")==0){ errcode = do_delete(argc,argv,hwnd,stringq,harc); }else{ STRINGQ_printf(stringq,"Error: Illegal long option [%s]\n",command); usage(stringq); errcode = ERROR_COMMAND_NAME; } if(!flag_quiet){ if(strcmp(command,"p")!=0){ STRINGQ_printf(stringq,"Closing URL[%s]\n",puburl); } StatusDialogPrintf(statusdialog,"Closing URL[%s]\r\n",puburl); } FtpCloseArchive(harc);harc=NULL; } } endlabel: if(statusdialog){ CloseStatusDialog(statusdialog); } STRINGQ_close(stringq); if(argv_for_free){free(argv_for_free);} return errcode; }