summaryrefslogtreecommitdiffstats
path: root/lib/libftp/utils/uftpcmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libftp/utils/uftpcmd.c')
-rw-r--r--lib/libftp/utils/uftpcmd.c1202
1 files changed, 1202 insertions, 0 deletions
diff --git a/lib/libftp/utils/uftpcmd.c b/lib/libftp/utils/uftpcmd.c
new file mode 100644
index 0000000..2eb3cb2
--- /dev/null
+++ b/lib/libftp/utils/uftpcmd.c
@@ -0,0 +1,1202 @@
+#include "uftp.h"
+
+String tmp;
+
+jmp_buf connectstack;
+
+
+
+Ftp_connect_hook(FTP *ftp,int code, char *msg)
+{
+ FtpLog(ftp->title,msg);
+ longjmp(connectstack,1);
+
+}
+
+
+Ftp_connect(ARGS)
+{
+ STATUS (*func1)(),(*func2)();
+
+ if (*w2==0) w2=readline("Host:");
+
+ if (FtpGetHost(w2)==NULL && FtpInit.IO != NULL)
+ {
+ char *msg;
+ extern int h_errno;
+
+ switch(h_errno)
+ {
+ case HOST_NOT_FOUND: msg = "Host unknown"; break;
+ case TRY_AGAIN: msg = "Hostname lookup failure";break;
+ default: msg = "gethostbyname failure";
+ }
+ return (*FtpInit.IO)(LINK,QUIT,msg);
+ }
+
+ newframe(0);
+
+ func1 = FtpInit.error;
+ func2 = FtpInit.IO;
+
+ if (trymode)
+ {
+ FtpSetErrorHandler(&FtpInit,Ftp_connect_hook);
+ FtpSetIOHandler(&FtpInit,Ftp_connect_hook);
+ setjmp(connectstack);
+ }
+
+ FtpConnect(&LINK,w2);
+ strcpy(iftp[frame].host,FtpGetHost(w2)->h_name);
+
+ FtpSetErrorHandler(LINK,func1);
+ FtpSetErrorHandler(&FtpInit,func1);
+ FtpSetIOHandler(LINK,func2);
+ FtpSetIOHandler(&FtpInit,func2);
+
+ return;
+}
+
+Ftp_user(ARGS)
+{
+
+ if (*w2==0)
+ {
+ sprintf(tmp,"login (default %s):",defaultuser);
+ w2=readline(tmp);
+ if (*w2==0)
+ w2=defaultuser;
+ }
+ strcpy(iftp[frame].user,w2);
+ strcpy(iftp[frame].pass,w3);
+ if (FtpUser(LINK,w2)==331) Ftp_pass("",w3,"","","","");
+}
+
+Ftp_pass(ARGS)
+{
+ if (*w2==0)
+ {
+ String pass;
+ String host;
+
+ gethostname(host, sizeof host);
+ strcpy(host,FtpGetHost(host)->h_name);
+ sprintf(pass,"%s@%s",getpwuid(getuid())->pw_name,host);
+ sprintf(tmp,"Password (default %s):",pass);
+ w2=getpass(tmp);
+ if (*w2==0) w2=pass;
+ }
+
+ strcpy(iftp[frame].pass,w2);
+ FtpPassword(LINK,w2);
+ strcpy(iftp[frame].pwd,FtpPwd(LINK));
+}
+
+Ftp_open(ARGS)
+{
+ register char *p1;
+ STATUS (*err)();
+
+ Ftp_connect("",w2,"","","","");
+ Ftp_user("",w3,w4,"","","" );
+ if (ifalias("autologin")) execute("autologin");
+ if (*w5)
+ Ftp_cd("cd",w5,"","","","");
+}
+
+Ftp_reopen(ARGS)
+{
+ String host,user,pass,pwd;
+
+ strcpy(host,iftp[frame].host);
+ strcpy(user,iftp[frame].user);
+ strcpy(pass,iftp[frame].pass);
+ strcpy(pwd,iftp[frame].pwd);
+
+ Ftp_close("","","","","","");
+ Ftp_open("",host,user,pass,pwd,"");
+}
+
+Ftp_ftp(ARGS)
+{
+ String pass;
+ String host;
+
+ gethostname(host, sizeof host);
+ strcpy(host,FtpGetHost(host)->h_name);
+ sprintf(pass,"%s@%s",getpwuid(getuid())->pw_name,host);
+
+ Ftp_open("",w2,"anonymous",pass,w3,"");
+ return;
+}
+
+Ftp_quit(ARGS)
+{
+ exit(0);
+}
+
+Ftp_mput_handler()
+{
+ log("File(s) or directory not found");
+ longjmp(start,1);
+}
+
+
+Ftp_lcd(ARGS)
+{
+ glob_t gl;
+
+ bzero(&gl,sizeof gl);
+
+ glob(w2,GLOB_BRACE|GLOB_TILDE|GLOB_QUOTE,
+ Ftp_mput_handler, &gl);
+
+
+ if (gl.gl_matchc<1 || chdir(*gl.gl_pathv))
+ perror(w2);
+
+ printf("Local directory is \"%s\"\n",getwd(tmp));
+}
+
+Ftp_dir(ARGS)
+{
+ char *cmd1;
+ String cmd;
+ char mode=LINK->mode;
+
+ if ( !strcmp(w1,"dir") )
+ cmd1="LIST";
+ else
+ cmd1="NLST";
+
+ strcpy(cmd,makestr(cmd1,w2,w3,w4,w5,w6,NULL));
+
+ if ( LINK->mode != 'A' ) FtpAscii(LINK);
+ FtpRetr(LINK,cmd,"","-");
+ if ( LINK->mode != mode ) FtpType(LINK,mode);
+
+}
+
+Ftp_close(ARGS)
+{
+ register int i;
+
+ if (isdigit(*w2))
+ {
+ i=atoi(w2);
+ }
+ else
+ {
+ i=frame;
+ }
+
+ FtpQuickBye(ftp[i]);
+
+ iftp[i].host[0]=0;
+ iftp[i].pwd[0]=0;
+ ftp[i]=NULL;
+ newframe(1);
+}
+
+
+INLINE SetLogicalVar(char arg, int * var, char *msg)
+{
+ switch(arg)
+ {
+
+ case 'y':
+
+ *var=1;
+ break;
+
+ case 'n':
+
+ *var=0;
+ break;
+
+ default:
+
+ (*var)?(*var=0):(*var=1);
+ break;
+ }
+ return printf("%s %s\n",msg,(*var)?"enable":"disable");
+}
+
+
+Ftp_set(ARGS)
+{
+ if (!strcmp("frame",w2))
+ return atoi(w3)<NFRAMES?frame=atoi(w3):0;
+
+ if (!strcmp("timeout",w2))
+ {
+ FtpSetTimeout(&FtpInit,atoi(w3));
+ if (LINK!=0)
+ FtpSetTimeout(LINK,atoi(w3));
+ return;
+ }
+
+ if (!strcmp("sleep",w2))
+ {
+ sleeptime=atoi(w3);
+ return;
+ }
+
+ if (!strcmp("debug",w2))
+ {
+ if ( *w3=='y' || *w3==0)
+ {
+ if (LINK!=NULL) FtpSetDebugHandler(LINK,FtpDebugDebug);
+ FtpSetDebugHandler(&FtpInit,FtpDebugDebug);
+ return puts("Debuging on for current and next session");
+ }
+ if ( *w3 == 'n')
+ {
+ if (LINK!=NULL) FtpSetDebugHandler(LINK,NULL);
+ FtpSetDebugHandler(&FtpInit,NULL);
+ return puts("Debuging off for current and next session");
+ }
+ }
+
+ if (!strcmp("bin",w2))
+ {
+ if ( *w3=='y' || *w3==0)
+ {
+ FtpInit.mode='I';
+ return puts("Binary mode enable");
+ }
+ if ( *w3 == 'n')
+ {
+ FtpInit.mode='A';
+ return puts("Binary mode disable");
+ }
+ }
+
+ if (!strcmp("try",w2))
+ return SetLogicalVar(*w3,&trymode,"Try mode");
+ if (!strcmp("hash",w2))
+ return SetLogicalVar(*w3,&hashmode,"Hash mode");
+ if (!strcmp("glass",w2))
+ return SetLogicalVar(*w3,&glassmode,"Glass mode");
+ if (!strcmp("rest",w2)||!strcmp(w2,"restore"))
+ return SetLogicalVar(*w3,&restmode,"Restore mode");
+
+ if (!strcmp("prompt",w2))
+ {
+ strcpy(prompt,w3);
+ return;
+ }
+
+ if (!strcmp("port",w2))
+ {
+ if ( isdigit(*w3))
+ return FtpSetPort(&FtpInit,atoi(w3));
+ puts("Port must be number");
+ fflush(stdout);
+ return;
+ }
+
+ if (!strcmp("noopinterval",w2)||!strcmp("noop",w2))
+ {
+ if ( isdigit(*w3))
+ return noopinterval=(time_t)atoi(w3);
+ puts("Time must be number");
+ fflush(stdout);
+ return;
+ }
+
+ if (!strcmp("nooptimeout",w2))
+ {
+ if ( isdigit(*w3))
+ return nooptimeout=(time_t)atoi(w3);
+ puts("Time must be number");
+ fflush(stdout);
+ return;
+ }
+
+
+
+ if (!strcmp("user",w2)||!strcmp("login",w2))
+ {
+ strcpy(defaultuser,w3);
+ return;
+ }
+
+ if (!strcmp("",w2))
+ {
+
+ printf("frime %d\n",frame);
+ printf("timeout %d secs\n",FtpInit.timeout.tv_sec);
+ printf("sleep time %d secs\n",sleeptime);
+ printf("debug %s\n",(FtpInit.debug!=NULL)?"enable":"disable");
+ printf("glass mode %s\n",glassmode?"enable":"disable");
+ printf("try mode %s\n",trymode?"enable":"disable");
+ printf("hash mode %s\n",hashmode?"enable":"disable");
+ printf("restore mode %s\n",restmode?"enable":"disable");
+ printf("automatic binary mode %s\n",(FtpInit.mode=='I')?"enable":"disable");
+ printf("prompt \"%s\"\n",prompt);
+ printf("port %d\n",FtpInit.port);
+ printf("noop interval %d\n",noopinterval);
+ printf("noop timeout %d\n",nooptimeout);
+ printf("Default login name \"%s\"\n",defaultuser);
+ fflush(stdout);
+ return;
+ }
+ return puts("arg 2 unknown");
+
+}
+
+jmp_buf getstack;
+
+Ftp_get_hook(FTP *con,int code, char *msg)
+{
+
+ if ( 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(getstack,3);
+}
+
+Ftp_get(ARGS)
+{
+ FTP OldInit;
+ int back=0;
+ int code;
+ int status=0;
+
+ OldInit=FtpInit;
+
+ if (strstr(w1,"put")!=NULL) back=1;
+
+
+ if (restmode || ((*w1=='r')&&(*(w1+1)=='e')) )
+ 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(stdout)))
+ FtpSetHashHandler(LINK,myhash);
+ else
+ FtpSetHashHandler(LINK,NULL);
+
+ myhash(LINK,0);
+
+ if (!back)
+ FtpGet(LINK,w2,makefilename(w2,w3));
+ else
+ FtpPut(LINK,w2,makefilename(w2,w3));
+
+
+ log("Transfer compliete");
+
+
+done:
+
+
+ FtpSetHashHandler(LINK,NULL);
+ FtpSetErrorHandler(LINK,my_error);
+ FtpSetIOHandler(LINK,my_error);
+ FtpClearFlag(LINK,FTP_REST);
+ FtpInit=OldInit;
+}
+
+Ftp_mget(ARGS)
+{
+ FILE *list;
+ char mode=LINK->mode;
+
+ sprintf(tmp,"/tmp/uftplist-%s.XXXXXX",getpwuid(getuid())->pw_name);
+ mktemp(tmp);
+
+ if ( LINK->mode != 'A' ) FtpAscii(LINK);
+
+ if (*w2==0)
+ FtpRetr(LINK,"NLST","",tmp);
+ else
+ FtpRetr(LINK,"NLST %s",w2,tmp);
+
+ if ( LINK->mode != mode ) FtpType(LINK,mode);
+
+ if ((list=fopen(tmp,"r"))==NULL)
+ return FtpLog(tmp,sys_errlist[errno]);
+
+ while ( fgets(tmp,sizeof tmp,list)!=NULL)
+ {
+ tmp[strlen(tmp)-1]=0;
+ Ftp_get("get",tmp,w3,"","","");
+ }
+
+ fclose(list);
+}
+
+Ftp_mput(ARGS)
+{
+ glob_t gl;
+
+ glob(w2,GLOB_BRACE|GLOB_TILDE|GLOB_QUOTE,
+ Ftp_mput_handler, &gl);
+
+ while(gl.gl_matchc--)
+ {
+ Ftp_get("put",*gl.gl_pathv,"","","","");
+ gl.gl_pathv++;
+ }
+}
+
+
+Ftp_bget(ARGS)
+{
+
+ String fn,lfn;
+ char *p;
+
+ newframe(0);
+
+ if (!FtpFullSyntax(w2,iftp[frame].host,iftp[frame].user,
+ iftp[frame].pass,fn))
+ return puts("Filename syntax error");
+
+ strcpy(iftp[frame].pwd,"/");
+
+ if ((p=strrchr(fn,'/'))!=NULL)
+ strcpy(lfn,p+1);
+ else
+ strcpy(lfn,fn);
+
+ FtpQuickBye(LINK);
+ LINK=FtpCreateObject();
+ LINK->sock=NULL;
+
+ Ftp_get("get",fn,(*w3==0)?lfn:w3,"","","");
+}
+
+Ftp_bput(ARGS)
+{
+
+ String fn,lfn;
+ char *p;
+
+ if (!FtpFullSyntax((*w3==0)?w2:w3,iftp[frame].host,iftp[frame].user,
+ iftp[frame].pass,fn))
+ return puts("Filename syntax error");
+
+ strcpy(iftp[frame].pwd,"/");
+
+ if ((p=strrchr(fn,'/'))!=NULL)
+ strcpy(lfn,p+1);
+ else
+ strcpy(lfn,fn);
+
+ FtpQuickBye(LINK);
+ LINK=FtpCreateObject();
+ LINK->sock=NULL;
+
+ Ftp_get("put",(*w3==0)?lfn:w2,fn,"","","");
+}
+
+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)
+{
+ if (fork())
+ {
+
+ log("Backgrounding...");
+ 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.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("","","","","","");
+ free(ftp[i]);
+ ftp[i]=NULL;
+ }
+
+ return executev(w2,w3,w4,w5,w6,"");
+ }
+}
+
+
+Ftp_list()
+{
+ register int i;
+
+#define _FMT "%-5s %-15s %-10s %-25s %-7s %-4s\n"
+#define FMT "%-5d %-15s %-10s %-25s %-7d %-4d\n"
+
+ printf(_FMT,"Frame","Host name","User's name","Working directory","Timeout","Port");
+
+ for ( i = 0 ; i < NFRAMES ; i++ )
+ if (ftp[i]!=NULL)
+ printf(FMT,i,iftp[i].host,iftp[i].user,iftp[i].pwd,
+ ftp[i]->timeout.tv_sec,ftp[i]->port);
+ fflush(stdout);
+ 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;
+ String out={'|',0};
+
+ if ((pager=(char *)getenv("PAGER"))==NULL)
+ pager="more";
+
+ strcat(out,pager);
+ FtpGet(LINK,w2,out);
+}
+
+
+Ftp_mkdir(ARGS)
+{
+ FtpMkdir(LINK,w2);
+}
+
+Ftp_rm(ARGS)
+{
+ FILE *list;
+
+ sprintf(tmp,"/tmp/uftplist-%s.XXXXXX",getpwuid(getuid())->pw_name);
+ mktemp(tmp);
+
+ if (*w2==0)
+ {
+ log("Filename specification must present");
+ return;
+ }
+
+ FtpRetr(LINK,"NLST %s",w2,tmp);
+
+ if ((list=fopen(tmp,"r"))==NULL)
+ return FtpLog(tmp,sys_errlist[errno]);
+
+ while ( fgets(tmp,sizeof tmp,list)!=NULL)
+ {
+ tmp[strlen(tmp)-1]=0;
+ FtpCommand(LINK,"DELE %s",tmp,0,EOF);
+ }
+
+ fclose(list);
+}
+
+
+
+
+Ftp_move(ARGS)
+{
+ FtpMove(LINK,w2,w3);
+}
+
+Ftp_help(ARGS)
+{
+ register int i,ii;
+
+ if ( !*w2 )
+ {
+ puts("Warrning!!!! \nPlease read general information using command \"help etc\"\n\n");
+
+ for ( i = 0 ;1; i++)
+ {
+ for ( ii = 0 ; ii < 5 ; ii++)
+ {
+ if (cmds[ii+i*5].cmd==NULL) return putchar('\n');
+ printf("%-16s",cmds[ii+i*5].cmd);
+ }
+ putchar ('\n');
+ }
+ }
+
+
+ for ( i = 0 ; 1; i++)
+ {
+
+ if (cmds[i].cmd==NULL) return puts("Command not found");
+ if (!strcmp(cmds[i].cmd,w2))
+ break;
+ }
+
+ puts(cmds[i].help);
+
+}
+
+Ftp_quote(ARGS)
+{
+ String new;
+
+ new[0]=0;
+
+ if (*w2!=0) strcpy(new,w2);
+ if (*w3!=0) strcat(new," "),strcat(new,w3);
+ if (*w4!=0) strcat(new," "),strcat(new,w4);
+ if (*w5!=0) strcat(new," "),strcat(new,w5);
+ if (*w6!=0) strcat(new," "),strcat(new,w6);
+
+ FtpCommand(LINK,new,"",0,EOF);
+}
+
+Ftp_alias(ARGS)
+{
+ ALIAS *a=firstalias;
+
+
+ if ( *w2==0 )
+ {
+ while (a!=NULL)
+ {
+ printf("%s=%s\n",a->name,a->str);
+ a=a->next;
+ }
+ return;
+ }
+
+
+ while (1)
+ {
+
+ if ( a == NULL )
+ {
+ firstalias = a = (ALIAS *) malloc(sizeof(ALIAS));
+ memset(a,0,sizeof(ALIAS));
+ a -> next = NULL;
+ break;
+ }
+
+ if (!strcmp(a->name,w2))
+ break;
+
+ if ( a->next == NULL)
+ {
+ a -> next = (ALIAS *) malloc(sizeof(ALIAS));
+ a = a->next;
+ memset(a,0,sizeof(ALIAS));
+ a -> next = NULL;
+ break;
+ }
+ a=a->next;
+ }
+
+ strcpy(a -> name,w2);
+ strcpy(a -> str,makestr(w3,w4,w5,w6,NULL));
+}
+
+Ftp_mkalias(ARGS)
+{
+ String new;
+
+ if (!*w2) return puts("Arg must present\n");
+
+ sprintf(new,"open \"%s\" \"%s\" \"%s\" \"%s\"",
+ iftp[frame].host,iftp[frame].user,
+ iftp[frame].pass,iftp[frame].pwd);
+
+ Ftp_alias("alias",w2,new,"","","");
+}
+
+Ftp_unalias(ARGS)
+{
+ ALIAS *cur,*prev;
+
+ cur=prev=firstalias;
+
+ while ( cur != NULL )
+ {
+ if (!strcmp(cur->name,w2))
+ {
+ if ( cur == firstalias )
+ {
+ firstalias = cur->next;
+ free(cur);
+ return;
+ }
+ prev -> next = cur -> next;
+ free(cur);
+ }
+ prev=cur;
+ cur=cur->next;
+ }
+}
+
+
+Ftp_save(ARGS)
+{
+ ALIAS *a=firstalias;
+ String fn;
+ FILE *out;
+
+ if ((out=fopen (getaliasrcname(),"w"))==NULL)
+ {
+ perror(getaliasrcname());
+ return;
+ }
+
+ while (a!=NULL)
+ {
+ fprintf(out,"alias %s '%s'\n",a->name,a->str);
+ a=a->next;
+ }
+ fclose(out);
+ chmod ( getaliasrcname(), 0600);
+ puts("Aliases saved");
+}
+
+#define ARCHIE_MAX_TARGETS 20
+
+Ftp_acd(ARGS)
+{
+ static int targets=0;
+ static String what={0};
+ static ARCHIE result[ARCHIE_MAX_TARGETS];
+
+ int i, selected_target;
+ String tmp;
+ char *p;
+
+
+ if ( (what[0] == 0 || strcmp(w2,what) != 0) && *w2!=0 )
+ {
+ if ((targets=FtpArchie(w2,result,ARCHIE_MAX_TARGETS))<1)
+ return puts("Archie failure or target not found");
+ strcpy(what,w2);
+ }
+
+ for (i=0;i<targets;i++)
+ printf("%2d %s:%s\n",i,result[i].host,result[i].file);
+
+ if (strcmp(w1,"archie")==0)
+ return;
+
+
+ p = readline("Your selection? ");
+ if (p==NULL) return;
+
+ selected_target = atoi(p);
+
+ if ( result[selected_target].file[strlen(result[selected_target].file)-1]
+ == '/' )
+ {
+ Ftp_ftp("ftp",result[selected_target].host,result[selected_target].file,
+ "","","");
+ return;
+ }
+ else
+ {
+ sprintf(tmp,"%s:%s",
+ result[selected_target].host,result[selected_target].file);
+ Ftp_bget("bget",tmp,"","","","");
+ }
+}
+
+
+CMDS cmds[]={
+
+ "connect", Ftp_connect, 0,
+ "connect <hostname> - make new ftp connection",
+
+ "open", Ftp_open, 0,
+ "open <hostname> <user> <pass> <directory> - login to server",
+
+ "reopen", Ftp_reopen, 1,
+ "Open again connection with existing frame information",
+
+ "ftp", Ftp_ftp, 0,
+ "ftp <hostname> - anonymously login to server",
+
+ "close", Ftp_close, 1,
+ "Close connection",
+
+ "quit", Ftp_quit, 0,
+ "Exit from uftp",
+
+ "set", Ftp_set, 0,
+"Set variables: (Without args print current settings)\n\
+ frame <number> - select another session(frame)\n\
+ timeout <secs> - Set network timeout\n\
+ nooptimeout <secs>- Set network timeout with clearing timeout\n\
+ noop <secs> - Set time interval for sending NOOP operator\n\
+ to server for erased delay\n\
+ sleep <secs> - Set pause beetween transfer attempt\n\
+ debug <y|n> - Set debuging ftp's protocol (Default no)\n\
+ try <y|n> - Set retransfer mode with broken network (Default yes)\n\
+ hash <y|n> - Set hashing transfer (Default no)\n\
+ restore <y|n> - Set retransfer mode (reget/reput) (Default yes!!!!)\n\
+ bin <y|n> - Set automatic turn on binary mode (Default no) \n\
+ glass <y|n> - Set glass mode (bad commands interprets as commands for FTPD)\n\
+ prompt <string> - Set prompt (See help prompt)\n\
+ port <number> - Set ftpd's port for next sessions\n\
+ user <name> - Set default user name (default you name)",
+
+ "prompt", NULL, 0,
+ "\
+prompt is a string, which may be contains %<char>
+or ^<char> combitanion, which have next interprets:
+
+%H, %h - full and short remote host names
+%M, %m - full and short local host names
+%u - remote user's name
+%d - remote current directory
+%D - local current directory
+%f - number of current frame
+%p - the ftp's port number
+%t - timeout
+%T - current time
+%P - uftp process id
+%% - character %
+^<char>- control character
+%^ - character ^
+",
+
+ "list", Ftp_list, 0,
+"List session's information",
+
+ "user", Ftp_user, 1,
+"user <user> - send user's name",
+
+ "pass", Ftp_pass, 1,
+"pass <pass> - send user's password",
+
+ "bin", Ftp_bin, 1,
+"Set binary mode for current frame",
+
+ "ascii", Ftp_ascii, 1,
+"Set ASCII mode for current frame",
+
+ "cd", Ftp_cd, 1,
+"cd <directory> - change current remote directory ",
+
+ "acd", Ftp_acd, 0,
+"acd <file_or_directory> - search pointed directory using archie, and setup connection to it",
+
+ "lcd", Ftp_lcd, 0,
+"Change local directory",
+
+ "abort", Ftp_abort, 1,
+"abort last operation",
+
+ "mkdir", Ftp_mkdir, 1,
+"mkdir <dirname> - create new directory",
+
+ "rm", Ftp_rm, 1,
+"rm <filename_spec> - remove file(s)",
+
+ "mv", Ftp_move, 1,
+"mv <old> <new> - rename file",
+
+ "dir", Ftp_dir, 1,
+"dir <argslist> ... - print list of files",
+
+ "ls", Ftp_dir, 1,
+"ls <arglist> ... - print short list of files",
+
+ "get", Ftp_get, 1,
+"get <remote_file> [<local_file>] - receive file from server",
+
+ "mget", Ftp_mget, 1,
+"mget <remote_file(s)> [<local_directory>] - receive file(s) from server",
+
+ "reget", Ftp_get, 1,
+"reget <remote_file> <local_file> - receive file restarting at end of local file",
+
+ "aget", Ftp_acd, 0,
+"aget <file> - search pointed file using archie, and retrive it",
+
+ "put", Ftp_get, 1,
+"put <local_file> [<remote_file>] - send server to file",
+
+ "mput", Ftp_mput, 1,
+"mput <local_file(s)> - send file(s) from server",
+
+ "reput", Ftp_get, 1,
+"reput <local_file> [<remote_file>] - send file restarting at end of remote file",
+
+ "bget", Ftp_bget, 0,
+"bget <libftp_file> [<localfile>] - full session procedure (See \"help etc\")",
+
+ "bput", Ftp_bput, 0,
+"bput [<localfile>] <libftp_file> - full session procedure (See \"help etc\")",
+
+ "copy", Ftp_copy, 1,
+"copy [<frame>!]file [<frame>!]file - copy file via client cache",
+
+ "ccopy", Ftp_ccopy, 1,
+"ccopy [<frame>!]file [<frame>!]file - copy file directly beetween servers",
+
+ "cat", Ftp_type, 1,
+"cat <file> - print body of remote file to screen",
+
+ "page", Ftp_page, 1,
+"page <file> - print body of remote file to screen via pager",
+
+ "bg", Ftp_bg, 0,
+"bg <any_command> - run command(s) backgroundly (output redirect to file),\n\
+You can also add &-char to back of line without \"bg\"",
+
+ "archie", Ftp_acd, 0,
+"Find file using archie service and display to screen",
+
+ "dup", Ftp_dup, 1,
+"Make new analogous frame",
+
+ "quote", Ftp_quote, 1,
+"quote <some_string> - send command directly to server",
+
+ "help", Ftp_help, 0,
+"help <command> - print list of commands or command description",
+
+ "alias", Ftp_alias, 0,
+"\
+alias aliasname <list> .... - make new alias, use $X for taking \n\
+ X's argument from command string, and $* for taking\n\
+ all arguments. If $<anything> on alias not present,\n\
+ the arguments appending to end of command string",
+
+ "unalias", Ftp_unalias, 0,
+"unalias <aliasname> - remove alias",
+
+ "mkalias", Ftp_mkalias, 0,
+"make alias for create this frame, use savealias for saving it to file",
+
+ "savealias", Ftp_save, 0,
+ "Save aliases to file",
+
+ "etc", NULL, 0,
+ "\
+1. In any command you may use constructions <file and >file for\n\
+ redirect input output.\n\
+\n\
+2. All local files files interprets as libftp file(s), \n\
+ this support next specification:\n\
+\n\
+ |string - interprets string as shell command, which must be\n\
+ execute and input or output take from/to it.\n\
+ \n\
+ hostname:filename - interprets as file, witch must be take \n\
+ using ftp protocol with anonymously access\n\
+ \n\
+ user@hostname:filename - interprets as file accesses via ftp\n\
+ with password yourname@your_host.your_domain\n\
+\n\
+ user/pass@hostname:filename - also ftp file.\n\
+\n\
+ *STDIN*, *STDOUT*, *STDERR* - opened streams.\n\
+\n\
+ anything - local file name.\n\
+\n\
+3. Command started with '!' passed to shell.\n
+\n\
+4. If string beetween two \" or \', its interprets as one word.\n\
+\n\
+5. Any string may be devide to few commands using ';'.",
+
+
+
+ NULL
+
+};
+
+
+
+
+
+
+
OpenPOWER on IntegriCloud