X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/37c5a70c5e7f7dfe8b7406701ea627c0eca3bb0f..7c871e89f98275124dbe6fcd13a365be647c3189:/usr/src/usr.bin/ftp/cmds.c diff --git a/usr/src/usr.bin/ftp/cmds.c b/usr/src/usr.bin/ftp/cmds.c index 0c5c5ff177..1bc3bbc76b 100644 --- a/usr/src/usr.bin/ftp/cmds.c +++ b/usr/src/usr.bin/ftp/cmds.c @@ -1,12 +1,12 @@ /* - * Copyright (c) 1985, 1989 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1985, 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. * * %sccs.include.redist.c% */ #ifndef lint -static char sccsid[] = "@(#)cmds.c 5.28 (Berkeley) %G%"; +static char sccsid[] = "@(#)cmds.c 8.4 (Berkeley) %G%"; #endif /* not lint */ /* @@ -16,34 +16,24 @@ static char sccsid[] = "@(#)cmds.c 5.28 (Berkeley) %G%"; #include #include #include - +#include #include +#include +#include +#include #include #include -#include -#include -#include +#include +#include #include -#include +#include #include "ftp_var.h" #include "pathnames.h" -extern char *globerr; -extern char **ftpglob(); -extern char *home; -extern char *remglob(); -extern char *getenv(); -extern char *index(); -extern char *rindex(); -extern char *strerror(); -extern int errno; -extern char reply_string[]; - -char *mname; -jmp_buf jabort; -char *dotrans(), *domap(); +jmp_buf jabort; +char *mname; /* * `Another' gets another argument, and stores the new argc and argv. @@ -51,13 +41,13 @@ char *dotrans(), *domap(); * * Returns false if no new arguments have been added. */ +int another(pargc, pargv, prompt) int *pargc; char ***pargv; char *prompt; { int len = strlen(line), ret; - extern sig_t intr(); if (len >= sizeof(line) - 3) { printf("sorry, arguments too long\n"); @@ -81,11 +71,12 @@ another(pargc, pargv, prompt) * Connect to peer server and * auto-login, if possible. */ +void setpeer(argc, argv) int argc; char *argv[]; { - char *host, *hookup(); + char *host; short port; if (connected) { @@ -138,10 +129,10 @@ setpeer(argc, argv) if (debug == 0) verbose = -1; if (command("SYST") == COMPLETE && overbose) { - register char *cp, c; - cp = index(reply_string+4, ' '); + char *cp, c; + cp = strchr(reply_string+4, ' '); if (cp == NULL) - cp = index(reply_string+4, '\r'); + cp = strchr(reply_string+4, '\r'); if (cp) { if (cp[-1] == '.') cp--; @@ -196,17 +187,18 @@ struct types { { "image", "I", TYPE_I, 0 }, { "ebcdic", "E", TYPE_E, 0 }, { "tenex", "L", TYPE_L, bytename }, - 0 + { NULL } }; /* * Set transfer type. */ +void settype(argc, argv) int argc; char *argv[]; { - register struct types *p; + struct types *p; int comret; if (argc > 2) { @@ -250,10 +242,11 @@ settype(argc, argv) * without changing our notion of the type for data transfers. * Used to change to and from ascii for listings. */ +void changetype(newtype, show) int newtype, show; { - register struct types *p; + struct types *p; int comret, oldverbose = verbose; if (newtype == 0) @@ -288,8 +281,12 @@ char *stype[] = { * Set binary transfer type. */ /*VARARGS*/ -setbinary() +void +setbinary(argc, argv) + int argc; + char **argv; { + stype[1] = "binary"; settype(2, stype); } @@ -298,8 +295,12 @@ setbinary() * Set ascii transfer type. */ /*VARARGS*/ -setascii() +void +setascii(argc, argv) + int argc; + char *argv[]; { + stype[1] = "ascii"; settype(2, stype); } @@ -308,8 +309,12 @@ setascii() * Set tenex transfer type. */ /*VARARGS*/ -settenex() +void +settenex(argc, argv) + int argc; + char *argv[]; { + stype[1] = "tenex"; settype(2, stype); } @@ -318,7 +323,8 @@ settenex() * Set file transfer mode. */ /*ARGSUSED*/ -setmode(argc, argv) +void +setftmode(argc, argv) int argc; char *argv[]; { @@ -331,6 +337,7 @@ setmode(argc, argv) * Set file transfer format. */ /*ARGSUSED*/ +void setform(argc, argv) int argc; char *argv[]; @@ -344,6 +351,7 @@ setform(argc, argv) * Set file transfer structure. */ /*ARGSUSED*/ +void setstruct(argc, argv) int argc; char *argv[]; @@ -356,6 +364,7 @@ setstruct(argc, argv) /* * Send a single file. */ +void put(argc, argv) int argc; char *argv[]; @@ -404,16 +413,15 @@ usage: /* * Send multiple files. */ +void mput(argc, argv) int argc; char **argv; { - extern jmp_buf jabort; - register int i; + int i; sig_t oldintr; int ointer; char *tp; - void mabort(); if (argc < 2 && !another(&argc, &argv, "local-files")) { printf("usage: %s local-files\n", argv[0]); @@ -474,7 +482,7 @@ mput(argc, argv) return; } for (i = 1; i < argc; i++) { - register char **cpp, **gargs; + char **cpp, **gargs; if (!doglob) { if (mflag && confirm(argv[0], argv[i])) { @@ -527,10 +535,13 @@ mput(argc, argv) mflag = 0; } +void +void /* * Receive one file. */ +int get(argc, argv) char *argv[]; { @@ -582,11 +593,12 @@ usage: recvrequest("RETR", argv[2], argv[1], "w"); } +/* ARGSUSED */ void -mabort() +mabort(signo) + int signo; { int ointer; - extern jmp_buf jabort; printf("\n"); (void) fflush(stdout); @@ -606,15 +618,14 @@ mabort() /* * Get multiple files. */ +void mget(argc, argv) int argc; char **argv; { - extern jmp_buf jabort; sig_t oldintr; int ch, ointer; char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN]; - void mabort(); if (argc < 2 && !another(&argc, &argv, "remote-files")) { printf("usage: %s remote-files\n", argv[0]); @@ -623,7 +634,7 @@ mget(argc, argv) } mname = argv[0]; mflag = 1; - oldintr = signal(SIGINT,mabort); + oldintr = signal(SIGINT, mabort); (void) setjmp(jabort); while ((cp = remglob(argv,proxy)) != NULL) { if (*cp == '\0') { @@ -681,7 +692,7 @@ remglob(argv,doswitch) ftemp = NULL; } } - return(NULL); + return (NULL); } if (!doglob) { if (args == NULL) @@ -715,7 +726,7 @@ remglob(argv,doswitch) (void) fclose(ftemp), ftemp = NULL; return (NULL); } - if ((cp = index(buf, '\n')) != NULL) + if ((cp = strchr(buf, '\n')) != NULL) *cp = '\0'; return (buf); } @@ -732,6 +743,7 @@ onoff(bool) * Show status. */ /*ARGSUSED*/ +void status(argc, argv) int argc; char *argv[]; @@ -787,7 +799,10 @@ status(argc, argv) * Set beep on cmd completed mode. */ /*VARARGS*/ -setbell() +void +setbell(argc, argv) + int argc; + char *argv[]; { bell = !bell; @@ -799,7 +814,10 @@ setbell() * Turn on packet tracing. */ /*VARARGS*/ -settrace() +void +settrace(argc, argv) + int argc; + char *argv[]; { trace = !trace; @@ -811,7 +829,10 @@ settrace() * Toggle hash mark printing during transfers. */ /*VARARGS*/ -sethash() +void +sethash(argc, argv) + int argc; + char *argv[]; { hash = !hash; @@ -826,7 +847,10 @@ sethash() * Turn on printing of server echo's. */ /*VARARGS*/ -setverbose() +void +setverbose(argc, argv) + int argc; + char *argv[]; { verbose = !verbose; @@ -838,7 +862,10 @@ setverbose() * Toggle PORT cmd use before each data connection. */ /*VARARGS*/ -setport() +void +setport(argc, argv) + int argc; + char *argv[]; { sendport = !sendport; @@ -851,7 +878,10 @@ setport() * during mget, mput, and mdelete. */ /*VARARGS*/ -setprompt() +void +setprompt(argc, argv) + int argc; + char *argv[]; { interactive = !interactive; @@ -864,7 +894,10 @@ setprompt() * on local file names. */ /*VARARGS*/ -setglob() +void +setglob(argc, argv) + int argc; + char *argv[]; { doglob = !doglob; @@ -877,6 +910,7 @@ setglob() * set level of debugging. */ /*VARARGS*/ +void setdebug(argc, argv) int argc; char *argv[]; @@ -905,6 +939,7 @@ setdebug(argc, argv) * Set current working directory * on remote machine. */ +void cd(argc, argv) int argc; char *argv[]; @@ -926,12 +961,12 @@ cd(argc, argv) * Set current working directory * on local machine. */ +void lcd(argc, argv) int argc; char *argv[]; { char buf[MAXPATHLEN]; - extern char *getwd(); if (argc < 2) argc++, argv[1] = home; @@ -945,7 +980,7 @@ lcd(argc, argv) return; } if (chdir(argv[1]) < 0) { - fprintf(stderr, "local: %s: %s\n", argv[1], strerror(errno)); + warn("local: %s", argv[1]); code = -1; return; } @@ -956,6 +991,7 @@ lcd(argc, argv) /* * Delete a single file. */ +void delete(argc, argv) int argc; char *argv[]; @@ -972,15 +1008,14 @@ delete(argc, argv) /* * Delete multiple files. */ +void mdelete(argc, argv) int argc; char **argv; { - extern jmp_buf jabort; sig_t oldintr; int ointer; char *cp; - void mabort(); if (argc < 2 && !another(&argc, &argv, "remote-files")) { printf("usage: %s remote-files\n", argv[0]); @@ -1015,6 +1050,7 @@ mdelete(argc, argv) /* * Rename a remote file. */ +void renamefile(argc, argv) int argc; char *argv[]; @@ -1036,6 +1072,7 @@ usage: * Get a directory listing * of remote files. */ +void ls(argc, argv) int argc; char *argv[]; @@ -1068,15 +1105,14 @@ ls(argc, argv) * Get a directory listing * of multiple remote files. */ +void mls(argc, argv) int argc; char **argv; { - extern jmp_buf jabort; sig_t oldintr; int ointer, i; char *cmd, mode[1], *dest; - void mabort(); if (argc < 2 && !another(&argc, &argv, "remote-files")) goto usage; @@ -1119,11 +1155,12 @@ usage: * Do a shell escape */ /*ARGSUSED*/ +void shell(argc, argv) int argc; char **argv; { - int pid; + pid_t pid; sig_t old1, old2; char shellnam[40], *shell, *namep; union wait status; @@ -1138,7 +1175,7 @@ shell(argc, argv) shell = getenv("SHELL"); if (shell == NULL) shell = _PATH_BSHELL; - namep = rindex(shell,'/'); + namep = strrchr(shell,'/'); if (namep == NULL) namep = shell; (void) strcpy(shellnam,"-"); @@ -1155,33 +1192,33 @@ shell(argc, argv) else { execl(shell,shellnam,(char *)0); } - perror(shell); + warn("%s", shell); code = -1; exit(1); - } + } if (pid > 0) while (wait((int *)&status) != pid) ; (void) signal(SIGINT, old1); (void) signal(SIGQUIT, old2); if (pid == -1) { - perror("Try again later"); + warn("%s", "Try again later"); code = -1; } else { code = 0; } - return (0); } /* * Send new user information (re-login) */ +void user(argc, argv) int argc; char **argv; { - char acct[80], *getpass(); + char acct[80]; int n, aflag = 0; if (argc < 2) @@ -1189,7 +1226,7 @@ user(argc, argv) if (argc < 2 || argc > 4) { printf("usage: %s username [password] [account]\n", argv[0]); code = -1; - return (0); + return; } n = command("USER %s", argv[1]); if (n == CONTINUE) { @@ -1209,19 +1246,21 @@ user(argc, argv) } if (n != COMPLETE) { fprintf(stdout, "Login failed.\n"); - return (0); + return; } if (!aflag && argc == 4) { (void) command("ACCT %s", argv[3]); } - return (1); } /* * Print working directory. */ /*VARARGS*/ -pwd() +void +pwd(argc, argv) + int argc; + char *argv[]; { int oldverbose = verbose; @@ -1239,6 +1278,7 @@ pwd() /* * Make a directory. */ +void makedir(argc, argv) int argc; char *argv[]; @@ -1259,6 +1299,7 @@ makedir(argc, argv) /* * Remove a directory. */ +void removedir(argc, argv) int argc; char *argv[]; @@ -1279,6 +1320,7 @@ removedir(argc, argv) /* * Send a line, verbatim, to the remote machine. */ +void quote(argc, argv) int argc; char *argv[]; @@ -1297,6 +1339,7 @@ quote(argc, argv) * is sent verbatim to the remote machine, except that the * word "SITE" is added at the front. */ +void site(argc, argv) int argc; char *argv[]; @@ -1314,12 +1357,13 @@ site(argc, argv) * Turn argv[1..argc) into a space-separated string, then prepend initial text. * Send the result as a one-line command and get response. */ +void quote1(initial, argc, argv) char *initial; int argc; char **argv; { - register int i, len; + int i, len; char buf[BUFSIZ]; /* must be >= sizeof(line) */ (void) strcpy(buf, initial); @@ -1332,10 +1376,12 @@ quote1(initial, argc, argv) } } if (command(buf) == PRELIM) { - while (getreply(0) == PRELIM); + while (getreply(0) == PRELIM) + continue; } } +void do_chmod(argc, argv) int argc; char *argv[]; @@ -1352,6 +1398,7 @@ usage: (void) command("SITE CHMOD %s %s", argv[1], argv[2]); } +void do_umask(argc, argv) int argc; char *argv[]; @@ -1363,6 +1410,7 @@ do_umask(argc, argv) verbose = oldverbose; } +void idle(argc, argv) int argc; char *argv[]; @@ -1377,6 +1425,7 @@ idle(argc, argv) /* * Ask the other side for help. */ +void rmthelp(argc, argv) int argc; char *argv[]; @@ -1392,14 +1441,17 @@ rmthelp(argc, argv) * Terminate session and exit. */ /*VARARGS*/ -quit() +void +quit(argc, argv) + int argc; + char *argv[]; { if (connected) - disconnect(); + disconnect(0, 0); pswitch(1); if (connected) { - disconnect(); + disconnect(0, 0); } exit(0); } @@ -1407,10 +1459,11 @@ quit() /* * Terminate session, but don't exit. */ -disconnect() +void +disconnect(argc, argv) + int argc; + char *argv[]; { - extern FILE *cout; - extern int data; if (!connected) return; @@ -1426,6 +1479,7 @@ disconnect() } } +int confirm(cmd, file) char *cmd, *file; { @@ -1440,12 +1494,12 @@ confirm(cmd, file) return (*line != 'n' && *line != 'N'); } +void fatal(msg) char *msg; { - fprintf(stderr, "ftp: %s\n", msg); - exit(1); + errx(1, "%s", msg); } /* @@ -1454,6 +1508,7 @@ fatal(msg) * Can't control multiple values being expanded * from the expression, we return only the first. */ +int globulize(cpp) char **cpp; { @@ -1473,14 +1528,15 @@ globulize(cpp) if (globbed) { *cpp = *globbed++; /* don't waste too much memory */ - if (*globbed) { - blkfree(*globbed); + if (globbed) { + blkfree(globbed); free((char *)*globbed); } } return (1); } +void account(argc,argv) int argc; char **argv; @@ -1510,7 +1566,6 @@ jmp_buf abortprox; void proxabort() { - extern int proxy; if (!proxy) { pswitch(1); @@ -1525,16 +1580,13 @@ proxabort() longjmp(abortprox,1); } -doproxy(argc,argv) +void +doproxy(argc, argv) int argc; char *argv[]; { - extern struct cmd cmdtab[]; - extern jmp_buf abortprox; - register struct cmd *c; - struct cmd *getcmd(); + struct cmd *c; sig_t oldintr; - void proxabort(); if (argc < 2 && !another(&argc, &argv, "command")) { printf("usage: %s command\n", argv[0]); @@ -1585,20 +1637,29 @@ doproxy(argc,argv) (void) signal(SIGINT, oldintr); } -setcase() +void +setcase(argc, argv) + int argc; + char *argv[]; { + mcase = !mcase; printf("Case mapping %s.\n", onoff(mcase)); code = mcase; } -setcr() +void +setcr(argc, argv) + int argc; + char *argv[]; { + crflag = !crflag; printf("Carriage Return stripping %s.\n", onoff(crflag)); code = crflag; } +void setntrans(argc,argv) int argc; char *argv[]; @@ -1627,9 +1688,10 @@ dotrans(name) { static char new[MAXPATHLEN]; char *cp1, *cp2 = new; - register int i, ostop, found; + int i, ostop, found; - for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++); + for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++) + continue; for (cp1 = name; *cp1; cp1++) { found = 0; for (i = 0; *(ntin + i) && i < 16; i++) { @@ -1646,9 +1708,10 @@ dotrans(name) } } *cp2 = '\0'; - return(new); + return (new); } +void setnmap(argc, argv) int argc; char *argv[]; @@ -1668,15 +1731,17 @@ setnmap(argc, argv) } mapflag = 1; code = 1; - cp = index(altarg, ' '); + cp = strchr(altarg, ' '); if (proxy) { - while(*++cp == ' '); + while(*++cp == ' ') + continue; altarg = cp; - cp = index(altarg, ' '); + cp = strchr(altarg, ' '); } *cp = '\0'; (void) strncpy(mapin, altarg, MAXPATHLEN - 1); - while (*++cp == ' '); + while (*++cp == ' ') + continue; (void) strncpy(mapout, cp, MAXPATHLEN - 1); } @@ -1685,7 +1750,7 @@ domap(name) char *name; { static char new[MAXPATHLEN]; - register char *cp1 = name, *cp2 = mapin; + char *cp1 = name, *cp2 = mapin; char *tp[9], *te[9]; int i, toks[9], toknum = 0, match = 1; @@ -1791,7 +1856,7 @@ LOOP: } if (!*cp2) { printf("nmap: unbalanced brackets\n"); - return(name); + return (name); } match = 1; cp2--; @@ -1804,7 +1869,7 @@ LOOP: } if (!*cp2) { printf("nmap: unbalanced brackets\n"); - return(name); + return (name); } break; } @@ -1845,28 +1910,40 @@ LOOP: } *cp1 = '\0'; if (!*new) { - return(name); + return (name); } - return(new); + return (new); } -setsunique() +void +setsunique(argc, argv) + int argc; + char *argv[]; { + sunique = !sunique; printf("Store unique %s.\n", onoff(sunique)); code = sunique; } -setrunique() +void +setrunique(argc, argv) + int argc; + char *argv[]; { + runique = !runique; printf("Receive unique %s.\n", onoff(runique)); code = runique; } /* change directory to perent directory */ -cdup() +void +cdup(argc, argv) + int argc; + char *argv[]; { + if (command("CDUP") == ERROR && code == 500) { if (verbose) printf("CDUP command not recognized, trying XCUP\n"); @@ -1876,11 +1953,16 @@ cdup() /* show remote system type */ -syst() +void +syst(argc, argv) + int argc; + char *argv[]; { + (void) command("SYST"); } +void macdef(argc, argv) int argc; char *argv[]; @@ -1944,6 +2026,7 @@ macdef(argc, argv) /* * get size of file on remote machine */ +void sizecmd(argc, argv) int argc; char *argv[]; @@ -1960,6 +2043,7 @@ sizecmd(argc, argv) /* * get last modification time of file on remote machine */ +void modtime(argc, argv) int argc; char *argv[]; @@ -1989,9 +2073,11 @@ modtime(argc, argv) /* * show status on remote machine */ +void rmtstatus(argc, argv) int argc; char *argv[]; { + (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]); }