📄 uftpcmd.c
字号:
fprintf(stderr,"sleep time %d secs\n",sleeptime); fprintf(stderr,"debug %s\n",(FtpInit.debug!=NULL)?"enable":"disable"); fprintf(stderr,"try mode %s\n",trymode?"enable":"disable"); fprintf(stderr,"hash mode %s\n",hashmode?"enable":"disable"); fprintf(stderr,"restore mode %s\n",restmode?"enable":"disable"); fprintf(stderr,"automatic binary mode %s\n",(FtpInit.mode=='I')?"enable":"disable"); fprintf(stderr,"prompt \"%s\"\n",prompt); fprintf(stderr,"port %d\n",FtpInit.port); fprintf(stderr,"noop interval %d\n",noopinterval); fprintf(stderr,"noop timeout %d\n",nooptimeout); fprintf(stderr,"wwwgateway %s\n",www_gateway); fprintf(stderr,"wwwport %d\n",www_port); fprintf(stderr,"Default login name \"%s\"\n",defaultuser); fflush(stderr); return; } return puts("arg 2 unknown"); }jmp_buf getstack;Ftp_get_hook(FTP *con,int code, char *msg){ if ( abs(code)==553 || (abs(code)==550 && FtpBadReply550(msg)) ) { FtpLog(con->title,msg); log("Transfer cancel"); longjmp(getstack,2); } if ( code == LQUIT ) { log(msg); log("Transfer leave after I/O error with local file"); longjmp(getstack,2); } FtpLog(con->title,msg); FtpQuickBye(LINK); LINK=NULL; log("sleeping......"); sleep(sleeptime); log("try again..."); longjmp(getstack,1); } void Ftp_get_intr(int sig){ signal(SIGINT,intr); log("Transfer interupt"); Ftp_abort(); longjmp(start,3);}Ftp_get(ARGS){ FTP OldInit; register int status=0; char *in="",*out=""; FtpString myhostname; OldInit=FtpInit; if (restmode) FtpSetFlag(LINK,FTP_REST); else FtpClearFlag(LINK,FTP_REST); if (trymode) { FtpSetErrorHandler(LINK,Ftp_get_hook); FtpSetIOHandler(LINK,Ftp_get_hook); FtpInit= (*LINK); FTPCMD(&FtpInit)=FTPCMD(&OldInit); FTPDATA(&FtpInit)=FTPDATA(&OldInit); } signal(SIGINT,Ftp_get_intr); FtpSetHashHandler(LINK,NULL); if ((status=setjmp(getstack))==2||status==3) goto done; if ((LINK==NULL)||(LINK->sock==FtpInit.sock)) { FtpLogin(&LINK,iftp[frame].host,iftp[frame].user, iftp[frame].pass,NULL); FtpChdir(LINK,iftp[frame].pwd); } if ((hashmode && isatty(fileno(stderr)) && strstr(w1,"dir")==NULL && strstr(w1,"ls")==NULL)) FtpSetHashHandler(LINK,myhash); else FtpSetHashHandler(LINK,NULL); myhash(LINK,0); gethostname(myhostname, sizeof myhostname); if (strstr(w1,"get")!=NULL) { FtpGet(LINK,in=w2,out=makefilename(w2,w3)); log_traffic(LINK->title,myhostname,in,out,LINK->counter); } if (strstr(w1,"put")!=NULL) { FtpPut(LINK,in=w2,out=makefilename(w2,w3)); log_traffic(myhostname,LINK->title,in,out,LINK->counter); } if (strstr(w1,"dir")!=NULL) FtpRetr(LINK,(*w2==0)?"LIST":"LIST %s",makestr(w2,w3,w4,w5,w6,NULL),"-"); if (strstr(w1,"ls")!=NULL) FtpRetr(LINK,(*w2==0)?"NLST":"NLST %s",makestr(w2,w3,w4,w5,w6,NULL),"-"); if (LINK->debug!=NULL) log("Transfer complete"); done: if (LINK!=NULL) { FtpSetHashHandler(LINK,NULL); FtpSetErrorHandler(LINK,my_error); FtpSetIOHandler(LINK,my_error); FtpClearFlag(LINK,FTP_REST); } FtpInit=OldInit;}Ftp_mget(ARGS){ FTP_STAT *ftpstat, *first; FtpString local; FtpString pwd; if (LINK==NULL || FTPCMD(LINK)==NULL ) Ftp_reopen(NULLARGS); while (FtpError(FtpStatus(LINK,FtpStat(LINK,w2,&ftpstat)))) { FtpStatFree(ftpstat); Ftp_reopen(NULLARGS); } first = ftpstat; strcpy(pwd,FtpPwd(LINK)); strcpy(iftp[frame].pwd,pwd); getcwd(local,sizeof local); while (ftpstat!=NULL) { if (ftpstat->type=='-') { FtpString tmp; struct stat st; if (stat(ftpstat->name,&st)==-1 || st.st_size < ftpstat->size) { sprintf(tmp,"get %s/%s",pwd,ftpstat->name); log(tmp); Ftp_get("get",ftpstat->name,"","","",""); chmod(ftpstat->name,ftpstat->mode); } } if (ftpstat->type=='l') symlink(ftpstat->link,ftpstat->name); ftpstat=ftpstat->next; } ftpstat=first; while(ftpstat!=NULL) { if ( ftpstat -> type == 'd' && strcmp(ftpstat->name,".")!=0 && strcmp(ftpstat->name,"..")!=0 && ((mkdir(ftpstat->name,ftpstat->mode),chdir(ftpstat->name))!=-1) && !FtpError(FtpStatus(LINK,FtpChdir(LINK,ftpstat->name)))) { Ftp_mget(NULLARGS); FtpChdir(LINK,pwd); } chdir(local); ftpstat=ftpstat->next; } strcpy(iftp[frame].pwd,pwd); FtpStatFree(first); }Ftp_proxyget(ARGS){ switch (FtpHttpGet(www_gateway,www_port,w2,"")) { case LQUIT: FtpLog("proxyget","error util work with local file"); break; case QUIT: FtpLog("proxyget","communication problem"); break; case OK: FtpLog("proxyget","Transfer complete"); break; case ENOENT: FtpLog("proxyget","No such file or directory (on remote host)"); break; default: FtpLog("proxyget","strange answer from libftp"); }}Ftp_rm(ARGS){ FTP_STAT *ftpstat, *first; FtpString local; FtpString pwd,tmp; while (FtpError(FtpStatus(LINK,FtpStat(LINK,w2,&ftpstat)))) { FtpStatFree(ftpstat); Ftp_reopen(NULLARGS); } first = ftpstat; strcpy(pwd,FtpPwd(LINK)); strcpy(iftp[frame].pwd,pwd); getcwd(local,sizeof local); for (;ftpstat!=NULL;ftpstat=ftpstat->next) if (ftpstat->type!='d') FtpStatus(LINK,FtpRm(LINK,ftpstat->name)), sprintf(tmp,"rm %s/%s",pwd,ftpstat->name), log(tmp); for (ftpstat=first;ftpstat!=NULL;ftpstat=ftpstat->next) if ( ftpstat -> type == 'd' && !FtpError(FtpStatus(LINK,FtpChdir(LINK,ftpstat->name)))) { Ftp_rm(NULLARGS); chdir(local); FtpChdir(LINK,pwd); FtpStatus(LINK,FtpCommand(LINK,"XRMD %s",ftpstat->name,0,EOF)); } strcpy(iftp[frame].pwd,pwd); FtpStatFree(first); }Ftp_copy(ARGS){ char *p; int in,out; if ( !*w2 || !*w3 ) return puts("Must pass two args"); if ((p=strchr(w2,'!'))!=NULL) { *p=0; in=atoi(w2); w2=p+1; } else in=frame; if ((p=strchr(w3,'!'))!=NULL) { *p=0; out=atoi(w3); w3=p+1; } else in=frame; if (in==out) return puts("Files must been from different frames"); FtpCopy(ftp[in],ftp[out],w2,w3);}Ftp_ccopy(ARGS){ char *p; int in,out; if ( !*w2 || !*w3 ) return puts("Must pass two args"); if ((p=strchr(w2,'!'))!=NULL) { *p=0; in=atoi(w2); w2=p+1; } else in=frame; if ((p=strchr(w3,'!'))!=NULL) { *p=0; out=atoi(w3); w3=p+1; } else in=frame; if (in==out) return puts("Files must been from different frames"); FtpPassiveTransfer(ftp[in],ftp[out],w2,w3);}Ftp_bin(ARGS){ FtpBinary(LINK);}Ftp_ascii(ARGS){ FtpAscii(LINK);}Ftp_cd(ARGS){ FtpChdir(LINK,w2); strcpy(iftp[frame].pwd,FtpPwd(LINK)); if (ifalias("autocd")) execute("autocd");}Ftp_dup(ARGS){ LINKINFO oldinfo; FTP oldftp; oldinfo=iftp[frame]; oldftp=(*LINK); newframe(0); puts("Make alternative connection..."); Ftp_open("",oldinfo.host,oldinfo.user,oldinfo.pass,"",""); if (strcmp(oldinfo.pwd,iftp[frame].pwd)) Ftp_cd("",oldinfo.pwd,"","","",""); if (LINK->mode!=oldftp.mode) FtpType(LINK,oldftp.mode); LINK -> timeout = oldftp.timeout; LINK -> flags = oldftp.flags; FtpSetDebugHandler(LINK,oldftp.debug); FtpSetErrorHandler(LINK,oldftp.error); FtpSetIOHandler(LINK,oldftp.IO); FtpSetHashHandler(LINK,oldftp.hash);} Ftp_bg(ARGS){ FtpString tmp; if (fork()) { log(makestr("Backgrounding \"",w2,w3,w4,w5,w6,"\"",NULL)); return; } else { int i=frame; lastcmd=1; /* Ignoring keypad */ alarm (0); signal(SIGALRM,SIG_IGN); signal(SIGURG,SIG_IGN); signal(SIGPIPE,SIG_IGN); signal(SIGTSTP,SIG_IGN); signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); signal(SIGCHLD,SIG_IGN); signal(SIGIO,SIG_IGN); /* Droping output*/ sprintf(tmp,"/tmp/uftp-%s",getpwuid(getuid())->pw_name); mkdir(tmp,0700); sprintf(tmp,"/tmp/uftp-%s/logfile.XXXXXX",getpwuid(getuid())->pw_name); mktemp(tmp); close(0);close(1);close(2); open(tmp,O_RDWR|O_TRUNC|O_CREAT,0600); dup(0);dup(0); if (LINK!=NULL) { Ftp_dup(NULLARGS); free(ftp[i]); ftp[i]=NULL; } executev(w2,w3,w4,w5,w6,""); exit(0); }} Ftp_list(){ register int i; #define _FMT "%-5s %-15s %-10s %-25s %-7s %-4s\n" #define FMT "%-5d %-15s %-10s %-25s %-7d %-4d\n" fprintf(stderr,_FMT,"Frame","Host name","User's name","Working directory","Timeout","Port"); for ( i = 0 ; i < NFRAMES ; i++ ) if (ftp[i]!=NULL) fprintf(stderr,FMT,i,iftp[i].host,iftp[i].user,iftp[i].pwd, ftp[i]->timeout.tv_sec,ftp[i]->port); fflush(stderr); return;}Ftp_abort(ARGS){ time_t save; if (LINK!=NULL) { save = LINK ->timeout.tv_sec; LINK->timeout.tv_sec = nooptimeout; FtpAbort(LINK); LINK->timeout.tv_sec = save; }}Ftp_type(ARGS){ FtpGet(LINK,w2,"*STDOUT*");}Ftp_page(ARGS){ register char *pager; FtpString out={'|',0}; if ((pager=(char *)getenv("PAGER"))==NULL) pager="more"; strcat(out,pager); FtpGet(LINK,w2,out);}Ftp_mkdir(ARGS){ FtpMkdir(LINK,w2);}Ftp_move(ARGS){ FtpMove(LINK,w2,w3);}Ftp_help(ARGS){ LIST *list=NULL; register int i,ii,w2_len=strlen(w2); if ( !*w2 ) { for ( i = 0 ; cmds[i].cmd!=NULL ; i++) list_add(&list,cmds[i].cmd); } else for ( i = 0 ; cmds[i].cmd!=NULL; i++) { int len=strlen(cmds[i].cmd); if (!strncmp(cmds[i].cmd,w2,MIN(len,w2_len))) list_add(&list,cmds[i].help); } list_sort(&list); printlist(&list); list_init(&list);}Ftp_quote(ARGS){ FtpString new; new[0]=0; strcpy(new,makestr(w2,w3,w4,w5,w6,NULL)); FtpCommand(LINK,new,"",0,EOF);}Ftp_alias(ARGS){ ALIAS *a=firstalias; if ( *w2==0 ) { while (a!=NULL) { fprintf(stderr,"%s=%s\n",a->name,a->str); a=a->next; } return; } while (1) { if ( a == NULL ) { firstalias = a = (ALIAS *) malloc(sizeof(ALIAS));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -