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

📄 uftp.c

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