⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uftpcmd.c

📁 linux下ftp的库源码
💻 C
📖 第 1 页 / 共 3 页
字号:
      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 + -