📄 uftp.c
字号:
static char rcsid[] = "$Id: uftp.c,v 5.0 1995/12/10 10:34:21 orel Exp $";/* $Log: uftp.c,v $ * Revision 5.0 1995/12/10 10:34:21 orel * LIBFTP Version 5.0 (Distributed revision) * * Revision 4.6 1995/12/02 11:24:01 orel * pathes for proxy get thru www-daemon * * Revision 4.5 1995/11/09 19:19:04 orel * Clean problem with end of last command at the end of current command * if last one shortly then first * , * * Revision 4.5 1995/11/09 19:19:04 orel * Clean problem with end of last command at the end of current command * if last one shortly then first * , * * Revision 4.4 1995/09/09 09:51:49 orel * Change type String to FtpString for clean conflicting with * X11's type string which is pointer to character only. * Thanks for MIT for this good name of type. * * Revision 4.3 1995/09/09 07:48:33 orel * Some corrections for trafic log file * * Revision 4.2 1995/08/19 18:42:25 orel * *** empty log message *** * * Revision 4.1 1995/08/19 18:07:06 orel * Fitch for calculate trafic for log * * Revision 4.0 1995/07/11 14:51:08 orel * Libftp version 4.0 * * Revision 4.0 1995/07/11 14:51:08 orel * Libftp version 4.0 * * Revision 3.5 1995/07/04 13:37:12 orel * chenge compctl function * * Revision 3.4 1995/06/28 13:52:37 orel * *** empty log message *** * * Revision 3.3 1995/06/28 13:37:26 orel * *** empty log message *** * * Revision 3.2 1995/06/21 09:28:34 orel * Porting to AIX and some modification.......... * * Revision 3.1 1995/06/20 15:54:28 orel * Porting to AIX * * Revision 3.0 1995/03/20 05:26:29 orel * *** empty log message *** * * Revision 2.14 1995/03/20 05:17:54 orel * *** empty log message *** * * Revision 2.13 1995/03/20 05:17:31 orel * *** empty log message *** * * Revision 2.13 1995/03/20 05:17:31 orel * *** empty log message *** * * Revision 2.12 1995/03/16 09:38:04 orel * SIGPIPE, hosts, ........ * * Revision 2.11 1995/03/07 16:01:40 orel * *** empty log message *** * * Revision 2.10 1995/03/05 15:02:08 orel * *** empty log message *** * * Revision 2.9 1995/02/26 16:41:21 orel * add recursive rm and recursive put * * Revision 2.8 1995/02/26 12:44:02 orel * *** empty log message *** * * Revision 2.7 1995/02/18 15:42:27 orel * add recursive mget * * Revision 2.6 1995/02/17 12:47:14 orel * add parallel mget * * Revision 2.6 1995/02/17 12:47:14 orel * add parallel mget * * Revision 2.5 1995/02/13 16:05:45 orel * add setargs * * Revision 2.4 1995/02/04 09:12:51 orel * rcs id **//* File Transfer Protocol Toolkit based on libftp */#include "uftp.h"#include <varargs.h>FTP *ftp[NFRAMES];LINKINFO iftp[NFRAMES];int frame=0;int status;jmp_buf start;int lastcmd=0;int trymode=1;int restmode=1;int hashmode=0;int sleeptime=30;int winsize;int interactive=0;time_t noopinterval=0;time_t nooptimeout=1;time_t prevtime=0;FtpString prompt="%T %u@%H:%d> ";FtpString defaultuser;FtpString www_gateway="www.cern.ch";int www_port=8080;ALIAS *firstalias=NULL;LIST *hosts=NULL;/* if main have any arguments, interprets each it as command with args */main(int argc, char **argv){ register int i; register char *p1; FtpString params; FtpString tmp1,tmp2; if (setjmp(start)!=0) goto main_loop; setsignals();#if defined(TIOCGWINSZ) && defined(SIGWINCH) getwinsz();#endif FtpSetErrorHandler(&FtpInit,my_error); FtpSetIOHandler(&FtpInit,my_error); strcpy(defaultuser,getpwuid(getuid())->pw_name); memset(ftp,0,sizeof(FTP*)*NFRAMES); memset(iftp,0,sizeof(LINKINFO)*NFRAMES); fprintf(stderr,"Welcome to uftp version %s (%s)\n", strcpy(tmp1,word(rcsid,3)), strcpy(tmp2,word(rcsid,4))); batch(SYSTEMRC); for (i=1, params[0]=0; i< argc; i++) { strcat(params,argv[i]); if (i+1!=argc) strcat(params," "); } load_link("ftp","open"); load_link("ftp","connect"); load_link("ftp","preconnect"); batch(getrcname()); batch(getaliasrcname()); batch(getsetsrcname()); load_compctl(); if (params[0]!=0) { FtpString new; strcpy(new,"open "); if (ifalias(params)||ifcmd(params)) execute (params); else strcat(new,params), execute(new); } gl_tab_hook=/*tab*/compctl_hook; main_loop: interactive=1; setsignals(); while (1) { setjmp(start); if (lastcmd) quit(0); p1=getline(getprompt()); if (p1==NULL||*p1==0) { quit(0); } if (strchr(p1,'\n')!=NULL) *(char*)strchr(p1,'\n')=0; if (*word(p1,1)==0) continue; gl_histadd(p1); execute(p1); }}/* Exacute few command separated by ';' . The character ' must use for mark complex works*/ execute (char *cmd){ FtpString w1,w2,w3,w4,w5,w6; FtpString newcmd; char *p; if (!*cmd || *cmd=='#' ) return; for ( p=newcmd ; *cmd; cmd++) { if ( *cmd == '\'' ) { *p++ = *cmd++; while ( *cmd != '\'' && *cmd != 0 ) *p++ = *cmd++; if ( *cmd == 0 ) return puts("Unbalanced \', please corrected!\n"); *p++ = *cmd; continue; } if ( *cmd == ';' ) { *p=0; execute(newcmd); p=newcmd; continue; } *p++ = *cmd; } *p=0; cmd=newcmd; if ( *cmd=='\\' ) cmd++; else { FtpString new; strcpy(new,"\\"); strcat(new,expandalias(cmd)); return execute(new); } if ( *cmd == '!' ) { int pid,_pid; int status; if (!(pid=fork())) { execlp(((char*)getenv("SHELL")==NULL)?"/bin/sh":(char *)getenv("SHELL"), "shell","-c",cmd+1,NULL); exit(-1); } while(1) { _pid=wait(&status); if (_pid==pid) return; } } redir(cmd); if (cmd[strlen(cmd)-1]=='&') { FtpString tmp; cmd[strlen(cmd)-1]=0; strcpy(tmp,"bg "); strcat(tmp,cmd); strcpy(cmd,tmp); } strcpy(w1,word(cmd,1)); strcpy(w2,word(cmd,2)); strcpy(w3,word(cmd,3)); strcpy(w4,word(cmd,4)); strcpy(w5,word(cmd,5)); strcpy(w6,word(cmd,6)); return executev(w1,w2,w3,w4,w5,w6); }executev(ARGS){ CMDS *xcmd = &cmds[0]; if (isdigit(*w1)) return atoi(w1)<NFRAMES?frame=atoi(w1):0, executev(w2,w3,w4,w5,w6,""); while ( xcmd -> cmd != NULL ) { if ( !strcmp(xcmd->cmd,w1) && (xcmd -> func != NULL) ) { int status; if ( xcmd -> need && LINK == NULL) return puts("Need connection to server"); iftp[frame].lock=1; unsetsignals(); status = (*xcmd->func)(w1,w2,w3,w4,w5,w6); iftp[frame].lock=0; setsignals(); redirback(); return status; } xcmd++; } fprintf(stderr,"%s: unknown command\n",w1); return -1;}void intr(int sig){ fprintf(stderr,"Interupted by signal %d\n",sig); if (LINK!=NULL) FtpSetHashHandler(LINK,NULL); setsignals(); prevtime = time((time_t *)0); longjmp(start,1);}newframe(int connecteble){ register int i; if (connecteble) for (i=0; i<NFRAMES; i++) if (ftp[i]!=NULL) return frame=i; for (i=0; i<NFRAMES; i++) if (ftp[i]==NULL) return frame=i; return -1;}STATUS my_error(FTP *ftp, int code, char *msg){ if (code==LQUIT||(ftp==NULL)) log(msg); else FtpLog(ftp->title,msg); if ( abs(code) == 530 && (strstr(msg,"anonymous")!=NULL)) { Ftp_reopen(); longjmp(start,1); } longjmp(start,1);}char *getrcname(){ static FtpString rcpath; struct passwd *pwd=getpwuid(getuid()); sprintf(rcpath,"%s/.uftprc",pwd->pw_dir); return rcpath;}char *getaliasrcname(){ static FtpString rcpath; struct passwd *pwd=getpwuid(getuid()); sprintf(rcpath,"%s/.uftp_aliases",pwd->pw_dir); return rcpath;}char *getsetsrcname(){ static FtpString rcpath; struct passwd *pwd=getpwuid(getuid()); sprintf(rcpath,"%s/.uftp_sets",pwd->pw_dir); return rcpath;}char *gethostsname(){ static FtpString rcpath; struct passwd *pwd=getpwuid(getuid()); sprintf(rcpath,"%s/.uftp_hosts",pwd->pw_dir); return rcpath;}char *makestr(va_alist) va_dcl{ char *p1; va_list args; static FtpString new; new[0]=0; va_start(args); while(1) { p1=va_arg(args,char *); if (p1==NULL) break; if (*p1!=0) { if (new[0]!=0) strcat(new," "); strcat(new,p1); } } va_end(args); return new;} #define ADD(str,chr) ( *(str)++ = (chr),*(str)=0)INLINE ADDSTR(char **str, char *str1){ while (*str1) *(*str)++ = *str1++; **str='\0';}char *expandalias(char *str){ ALIAS *a=firstalias; static FtpString new; FtpString w1={0}; char *p,*p1=new,*args; int dollar=0; new[0]=0; strcpy(w1,word(str,1)); if ( (p=strchr(str,' '))!=NULL ) args=p+1; else args=""; while (a) { if (!strcmp(a->name,w1)) break; a=a->next; } if (!a) return str; for ( p=a->str; *p; p++) { if ( *p != '$' ) { ADD(p1,*p); continue; } dollar=1; p++; if (isdigit(*p)) { ADDSTR(&p1,word(str,(*p)-'0'+1)); continue; } switch (*p) { case '\0': case '$': ADD(p1,'$');continue; case '*': ADDSTR(&p1,args);continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -