use glob in libc instead of local version
[unix-history] / usr / src / usr.bin / ftp / cmds.c
index 8a37ea4..1bc3bbc 100644 (file)
@@ -1,12 +1,12 @@
 /*
 /*
- * Copyright (c) 1985, 1989, 1993
+ * Copyright (c) 1985, 1989, 1993, 1994
  *     The Regents of the University of California.  All rights reserved.
  *
  * %sccs.include.redist.c%
  */
 
 #ifndef lint
  *     The Regents of the University of California.  All rights reserved.
  *
  * %sccs.include.redist.c%
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)cmds.c     8.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)cmds.c     8.4 (Berkeley) %G%";
 #endif /* not lint */
 
 /*
 #endif /* not lint */
 
 /*
@@ -16,34 +16,24 @@ static char sccsid[] = "@(#)cmds.c  8.1 (Berkeley) %G%";
 #include <sys/wait.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/wait.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
-
+#include <netinet/in.h>
 #include <arpa/ftp.h>
 
 #include <arpa/ftp.h>
 
+#include <ctype.h>
+#include <err.h>
+#include <netdb.h>
 #include <signal.h>
 #include <stdio.h>
 #include <signal.h>
 #include <stdio.h>
-#include <errno.h>
-#include <netdb.h>
-#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
 #include <time.h>
 #include <time.h>
-#include <netinet/in.h>
+#include <unistd.h>
 
 #include "ftp_var.h"
 #include "pathnames.h"
 
 
 #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.
 
 /*
  * `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.
  */
  *
  * 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;
 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");
 
        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.
  */
  * Connect to peer server and
  * auto-login, if possible.
  */
+void
 setpeer(argc, argv)
        int argc;
        char *argv[];
 {
 setpeer(argc, argv)
        int argc;
        char *argv[];
 {
-       char *host, *hookup();
+       char *host;
        short port;
 
        if (connected) {
        short port;
 
        if (connected) {
@@ -138,10 +129,10 @@ setpeer(argc, argv)
                if (debug == 0)
                        verbose = -1;
                if (command("SYST") == COMPLETE && overbose) {
                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)
                        if (cp == NULL)
-                               cp = index(reply_string+4, '\r');
+                               cp = strchr(reply_string+4, '\r');
                        if (cp) {
                                if (cp[-1] == '.')
                                        cp--;
                        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 },
        { "image",      "I",    TYPE_I, 0 },
        { "ebcdic",     "E",    TYPE_E, 0 },
        { "tenex",      "L",    TYPE_L, bytename },
-       0
+       { NULL }
 };
 
 /*
  * Set transfer type.
  */
 };
 
 /*
  * Set transfer type.
  */
+void
 settype(argc, argv)
        int argc;
        char *argv[];
 {
 settype(argc, argv)
        int argc;
        char *argv[];
 {
-       register struct types *p;
+       struct types *p;
        int comret;
 
        if (argc > 2) {
        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.
  */
  * 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;
 {
 changetype(newtype, show)
        int newtype, show;
 {
-       register struct types *p;
+       struct types *p;
        int comret, oldverbose = verbose;
 
        if (newtype == 0)
        int comret, oldverbose = verbose;
 
        if (newtype == 0)
@@ -288,8 +281,12 @@ char *stype[] = {
  * Set binary transfer type.
  */
 /*VARARGS*/
  * Set binary transfer type.
  */
 /*VARARGS*/
-setbinary()
+void
+setbinary(argc, argv)
+       int argc;
+       char **argv;
 {
 {
+
        stype[1] = "binary";
        settype(2, stype);
 }
        stype[1] = "binary";
        settype(2, stype);
 }
@@ -298,8 +295,12 @@ setbinary()
  * Set ascii transfer type.
  */
 /*VARARGS*/
  * Set ascii transfer type.
  */
 /*VARARGS*/
-setascii()
+void
+setascii(argc, argv)
+       int argc;
+       char *argv[];
 {
 {
+
        stype[1] = "ascii";
        settype(2, stype);
 }
        stype[1] = "ascii";
        settype(2, stype);
 }
@@ -308,8 +309,12 @@ setascii()
  * Set tenex transfer type.
  */
 /*VARARGS*/
  * Set tenex transfer type.
  */
 /*VARARGS*/
-settenex()
+void
+settenex(argc, argv)
+       int argc;
+       char *argv[];
 {
 {
+
        stype[1] = "tenex";
        settype(2, stype);
 }
        stype[1] = "tenex";
        settype(2, stype);
 }
@@ -318,7 +323,8 @@ settenex()
  * Set file transfer mode.
  */
 /*ARGSUSED*/
  * Set file transfer mode.
  */
 /*ARGSUSED*/
-setmode(argc, argv)
+void
+setftmode(argc, argv)
        int argc;
        char *argv[];
 {
        int argc;
        char *argv[];
 {
@@ -331,6 +337,7 @@ setmode(argc, argv)
  * Set file transfer format.
  */
 /*ARGSUSED*/
  * Set file transfer format.
  */
 /*ARGSUSED*/
+void
 setform(argc, argv)
        int argc;
        char *argv[];
 setform(argc, argv)
        int argc;
        char *argv[];
@@ -344,6 +351,7 @@ setform(argc, argv)
  * Set file transfer structure.
  */
 /*ARGSUSED*/
  * Set file transfer structure.
  */
 /*ARGSUSED*/
+void
 setstruct(argc, argv)
        int argc;
        char *argv[];
 setstruct(argc, argv)
        int argc;
        char *argv[];
@@ -356,6 +364,7 @@ setstruct(argc, argv)
 /*
  * Send a single file.
  */
 /*
  * Send a single file.
  */
+void
 put(argc, argv)
        int argc;
        char *argv[];
 put(argc, argv)
        int argc;
        char *argv[];
@@ -404,16 +413,15 @@ usage:
 /*
  * Send multiple files.
  */
 /*
  * Send multiple files.
  */
+void
 mput(argc, argv)
        int argc;
        char **argv;
 {
 mput(argc, argv)
        int argc;
        char **argv;
 {
-       extern jmp_buf jabort;
-       register int i;
+       int i;
        sig_t oldintr;
        int ointer;
        char *tp;
        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]);
 
        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++) {
                return;
        }
        for (i = 1; i < argc; i++) {
-               register char **cpp, **gargs;
+               char **cpp, **gargs;
 
                if (!doglob) {
                        if (mflag && confirm(argv[0], argv[i])) {
 
                if (!doglob) {
                        if (mflag && confirm(argv[0], argv[i])) {
@@ -527,10 +535,13 @@ mput(argc, argv)
        mflag = 0;
 }
 
        mflag = 0;
 }
 
+void
 
 
+void
 /*
  * Receive one file.
  */
 /*
  * Receive one file.
  */
+int
 get(argc, argv)
        char *argv[];
 {
 get(argc, argv)
        char *argv[];
 {
@@ -582,11 +593,12 @@ usage:
        recvrequest("RETR", argv[2], argv[1], "w");
 }
 
        recvrequest("RETR", argv[2], argv[1], "w");
 }
 
+/* ARGSUSED */
 void
 void
-mabort()
+mabort(signo)
+       int signo;
 {
        int ointer;
 {
        int ointer;
-       extern jmp_buf jabort;
 
        printf("\n");
        (void) fflush(stdout);
 
        printf("\n");
        (void) fflush(stdout);
@@ -606,15 +618,14 @@ mabort()
 /*
  * Get multiple files.
  */
 /*
  * Get multiple files.
  */
+void
 mget(argc, argv)
        int argc;
        char **argv;
 {
 mget(argc, argv)
        int argc;
        char **argv;
 {
-       extern jmp_buf jabort;
        sig_t oldintr;
        int ch, ointer;
        char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN];
        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]);
 
        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;
        }
        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') {
        (void) setjmp(jabort);
        while ((cp = remglob(argv,proxy)) != NULL) {
                if (*cp == '\0') {
@@ -681,7 +692,7 @@ remglob(argv,doswitch)
                                ftemp = NULL;
                        }
                }
                                ftemp = NULL;
                        }
                }
-               return(NULL);
+               return (NULL);
        }
        if (!doglob) {
                if (args == NULL)
        }
        if (!doglob) {
                if (args == NULL)
@@ -715,7 +726,7 @@ remglob(argv,doswitch)
                (void) fclose(ftemp), ftemp = NULL;
                return (NULL);
        }
                (void) fclose(ftemp), ftemp = NULL;
                return (NULL);
        }
-       if ((cp = index(buf, '\n')) != NULL)
+       if ((cp = strchr(buf, '\n')) != NULL)
                *cp = '\0';
        return (buf);
 }
                *cp = '\0';
        return (buf);
 }
@@ -732,6 +743,7 @@ onoff(bool)
  * Show status.
  */
 /*ARGSUSED*/
  * Show status.
  */
 /*ARGSUSED*/
+void
 status(argc, argv)
        int argc;
        char *argv[];
 status(argc, argv)
        int argc;
        char *argv[];
@@ -787,7 +799,10 @@ status(argc, argv)
  * Set beep on cmd completed mode.
  */
 /*VARARGS*/
  * Set beep on cmd completed mode.
  */
 /*VARARGS*/
-setbell()
+void
+setbell(argc, argv)
+       int argc;
+       char *argv[];
 {
 
        bell = !bell;
 {
 
        bell = !bell;
@@ -799,7 +814,10 @@ setbell()
  * Turn on packet tracing.
  */
 /*VARARGS*/
  * Turn on packet tracing.
  */
 /*VARARGS*/
-settrace()
+void
+settrace(argc, argv)
+       int argc;
+       char *argv[];
 {
 
        trace = !trace;
 {
 
        trace = !trace;
@@ -811,7 +829,10 @@ settrace()
  * Toggle hash mark printing during transfers.
  */
 /*VARARGS*/
  * Toggle hash mark printing during transfers.
  */
 /*VARARGS*/
-sethash()
+void
+sethash(argc, argv)
+       int argc;
+       char *argv[];
 {
 
        hash = !hash;
 {
 
        hash = !hash;
@@ -826,7 +847,10 @@ sethash()
  * Turn on printing of server echo's.
  */
 /*VARARGS*/
  * Turn on printing of server echo's.
  */
 /*VARARGS*/
-setverbose()
+void
+setverbose(argc, argv)
+       int argc;
+       char *argv[];
 {
 
        verbose = !verbose;
 {
 
        verbose = !verbose;
@@ -838,7 +862,10 @@ setverbose()
  * Toggle PORT cmd use before each data connection.
  */
 /*VARARGS*/
  * Toggle PORT cmd use before each data connection.
  */
 /*VARARGS*/
-setport()
+void
+setport(argc, argv)
+       int argc;
+       char *argv[];
 {
 
        sendport = !sendport;
 {
 
        sendport = !sendport;
@@ -851,7 +878,10 @@ setport()
  * during mget, mput, and mdelete.
  */
 /*VARARGS*/
  * during mget, mput, and mdelete.
  */
 /*VARARGS*/
-setprompt()
+void
+setprompt(argc, argv)
+       int argc;
+       char *argv[];
 {
 
        interactive = !interactive;
 {
 
        interactive = !interactive;
@@ -864,7 +894,10 @@ setprompt()
  * on local file names.
  */
 /*VARARGS*/
  * on local file names.
  */
 /*VARARGS*/
-setglob()
+void
+setglob(argc, argv)
+       int argc;
+       char *argv[];
 {
        
        doglob = !doglob;
 {
        
        doglob = !doglob;
@@ -877,6 +910,7 @@ setglob()
  * set level of debugging.
  */
 /*VARARGS*/
  * set level of debugging.
  */
 /*VARARGS*/
+void
 setdebug(argc, argv)
        int argc;
        char *argv[];
 setdebug(argc, argv)
        int argc;
        char *argv[];
@@ -905,6 +939,7 @@ setdebug(argc, argv)
  * Set current working directory
  * on remote machine.
  */
  * Set current working directory
  * on remote machine.
  */
+void
 cd(argc, argv)
        int argc;
        char *argv[];
 cd(argc, argv)
        int argc;
        char *argv[];
@@ -926,12 +961,12 @@ cd(argc, argv)
  * Set current working directory
  * on local machine.
  */
  * Set current working directory
  * on local machine.
  */
+void
 lcd(argc, argv)
        int argc;
        char *argv[];
 {
        char buf[MAXPATHLEN];
 lcd(argc, argv)
        int argc;
        char *argv[];
 {
        char buf[MAXPATHLEN];
-       extern char *getwd();
 
        if (argc < 2)
                argc++, argv[1] = home;
 
        if (argc < 2)
                argc++, argv[1] = home;
@@ -945,7 +980,7 @@ lcd(argc, argv)
                return;
        }
        if (chdir(argv[1]) < 0) {
                return;
        }
        if (chdir(argv[1]) < 0) {
-               fprintf(stderr, "local: %s: %s\n", argv[1], strerror(errno));
+               warn("local: %s", argv[1]);
                code = -1;
                return;
        }
                code = -1;
                return;
        }
@@ -956,6 +991,7 @@ lcd(argc, argv)
 /*
  * Delete a single file.
  */
 /*
  * Delete a single file.
  */
+void
 delete(argc, argv)
        int argc;
        char *argv[];
 delete(argc, argv)
        int argc;
        char *argv[];
@@ -972,15 +1008,14 @@ delete(argc, argv)
 /*
  * Delete multiple files.
  */
 /*
  * Delete multiple files.
  */
+void
 mdelete(argc, argv)
        int argc;
        char **argv;
 {
 mdelete(argc, argv)
        int argc;
        char **argv;
 {
-       extern jmp_buf jabort;
        sig_t oldintr;
        int ointer;
        char *cp;
        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]);
 
        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.
  */
 /*
  * Rename a remote file.
  */
+void
 renamefile(argc, argv)
        int argc;
        char *argv[];
 renamefile(argc, argv)
        int argc;
        char *argv[];
@@ -1036,6 +1072,7 @@ usage:
  * Get a directory listing
  * of remote files.
  */
  * Get a directory listing
  * of remote files.
  */
+void
 ls(argc, argv)
        int argc;
        char *argv[];
 ls(argc, argv)
        int argc;
        char *argv[];
@@ -1068,15 +1105,14 @@ ls(argc, argv)
  * Get a directory listing
  * of multiple remote files.
  */
  * Get a directory listing
  * of multiple remote files.
  */
+void
 mls(argc, argv)
        int argc;
        char **argv;
 {
 mls(argc, argv)
        int argc;
        char **argv;
 {
-       extern jmp_buf jabort;
        sig_t oldintr;
        int ointer, i;
        char *cmd, mode[1], *dest;
        sig_t oldintr;
        int ointer, i;
        char *cmd, mode[1], *dest;
-       void mabort();
 
        if (argc < 2 && !another(&argc, &argv, "remote-files"))
                goto usage;
 
        if (argc < 2 && !another(&argc, &argv, "remote-files"))
                goto usage;
@@ -1119,11 +1155,12 @@ usage:
  * Do a shell escape
  */
 /*ARGSUSED*/
  * Do a shell escape
  */
 /*ARGSUSED*/
+void
 shell(argc, argv)
        int argc;
        char **argv;
 {
 shell(argc, argv)
        int argc;
        char **argv;
 {
-       int pid;
+       pid_t pid;
        sig_t old1, old2;
        char shellnam[40], *shell, *namep; 
        union wait status;
        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;
                shell = getenv("SHELL");
                if (shell == NULL)
                        shell = _PATH_BSHELL;
-               namep = rindex(shell,'/');
+               namep = strrchr(shell,'/');
                if (namep == NULL)
                        namep = shell;
                (void) strcpy(shellnam,"-");
                if (namep == NULL)
                        namep = shell;
                (void) strcpy(shellnam,"-");
@@ -1155,33 +1192,33 @@ shell(argc, argv)
                else {
                        execl(shell,shellnam,(char *)0);
                }
                else {
                        execl(shell,shellnam,(char *)0);
                }
-               perror(shell);
+               warn("%s", shell);
                code = -1;
                exit(1);
                code = -1;
                exit(1);
-               }
+       }
        if (pid > 0)
                while (wait((int *)&status) != pid)
                        ;
        (void) signal(SIGINT, old1);
        (void) signal(SIGQUIT, old2);
        if (pid == -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;
        }
                code = -1;
        }
        else {
                code = 0;
        }
-       return (0);
 }
 
 /*
  * Send new user information (re-login)
  */
 }
 
 /*
  * Send new user information (re-login)
  */
+void
 user(argc, argv)
        int argc;
        char **argv;
 {
 user(argc, argv)
        int argc;
        char **argv;
 {
-       char acct[80], *getpass();
+       char acct[80];
        int n, aflag = 0;
 
        if (argc < 2)
        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;
        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) {
        }
        n = command("USER %s", argv[1]);
        if (n == CONTINUE) {
@@ -1209,19 +1246,21 @@ user(argc, argv)
        }
        if (n != COMPLETE) {
                fprintf(stdout, "Login failed.\n");
        }
        if (n != COMPLETE) {
                fprintf(stdout, "Login failed.\n");
-               return (0);
+               return;
        }
        if (!aflag && argc == 4) {
                (void) command("ACCT %s", argv[3]);
        }
        }
        if (!aflag && argc == 4) {
                (void) command("ACCT %s", argv[3]);
        }
-       return (1);
 }
 
 /*
  * Print working directory.
  */
 /*VARARGS*/
 }
 
 /*
  * Print working directory.
  */
 /*VARARGS*/
-pwd()
+void
+pwd(argc, argv)
+       int argc;
+       char *argv[];
 {
        int oldverbose = verbose;
 
 {
        int oldverbose = verbose;
 
@@ -1239,6 +1278,7 @@ pwd()
 /*
  * Make a directory.
  */
 /*
  * Make a directory.
  */
+void
 makedir(argc, argv)
        int argc;
        char *argv[];
 makedir(argc, argv)
        int argc;
        char *argv[];
@@ -1259,6 +1299,7 @@ makedir(argc, argv)
 /*
  * Remove a directory.
  */
 /*
  * Remove a directory.
  */
+void
 removedir(argc, argv)
        int argc;
        char *argv[];
 removedir(argc, argv)
        int argc;
        char *argv[];
@@ -1279,6 +1320,7 @@ removedir(argc, argv)
 /*
  * Send a line, verbatim, to the remote machine.
  */
 /*
  * Send a line, verbatim, to the remote machine.
  */
+void
 quote(argc, argv)
        int argc;
        char *argv[];
 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.
  */
  * 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[];
 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.
  */
  * 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;
 {
 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);
        char buf[BUFSIZ];               /* must be >= sizeof(line) */
 
        (void) strcpy(buf, initial);
@@ -1332,10 +1376,12 @@ quote1(initial, argc, argv)
                }
        }
        if (command(buf) == PRELIM) {
                }
        }
        if (command(buf) == PRELIM) {
-               while (getreply(0) == PRELIM);
+               while (getreply(0) == PRELIM)
+                       continue;
        }
 }
 
        }
 }
 
+void
 do_chmod(argc, argv)
        int argc;
        char *argv[];
 do_chmod(argc, argv)
        int argc;
        char *argv[];
@@ -1352,6 +1398,7 @@ usage:
        (void) command("SITE CHMOD %s %s", argv[1], argv[2]);
 }
 
        (void) command("SITE CHMOD %s %s", argv[1], argv[2]);
 }
 
+void
 do_umask(argc, argv)
        int argc;
        char *argv[];
 do_umask(argc, argv)
        int argc;
        char *argv[];
@@ -1363,6 +1410,7 @@ do_umask(argc, argv)
        verbose = oldverbose;
 }
 
        verbose = oldverbose;
 }
 
+void
 idle(argc, argv)
        int argc;
        char *argv[];
 idle(argc, argv)
        int argc;
        char *argv[];
@@ -1377,6 +1425,7 @@ idle(argc, argv)
 /*
  * Ask the other side for help.
  */
 /*
  * Ask the other side for help.
  */
+void
 rmthelp(argc, argv)
        int argc;
        char *argv[];
 rmthelp(argc, argv)
        int argc;
        char *argv[];
@@ -1392,14 +1441,17 @@ rmthelp(argc, argv)
  * Terminate session and exit.
  */
 /*VARARGS*/
  * Terminate session and exit.
  */
 /*VARARGS*/
-quit()
+void
+quit(argc, argv)
+       int argc;
+       char *argv[];
 {
 
        if (connected)
 {
 
        if (connected)
-               disconnect();
+               disconnect(0, 0);
        pswitch(1);
        if (connected) {
        pswitch(1);
        if (connected) {
-               disconnect();
+               disconnect(0, 0);
        }
        exit(0);
 }
        }
        exit(0);
 }
@@ -1407,10 +1459,11 @@ quit()
 /*
  * Terminate session, but don't exit.
  */
 /*
  * Terminate session, but don't exit.
  */
-disconnect()
+void
+disconnect(argc, argv)
+       int argc;
+       char *argv[];
 {
 {
-       extern FILE *cout;
-       extern int data;
 
        if (!connected)
                return;
 
        if (!connected)
                return;
@@ -1426,6 +1479,7 @@ disconnect()
        }
 }
 
        }
 }
 
+int
 confirm(cmd, file)
        char *cmd, *file;
 {
 confirm(cmd, file)
        char *cmd, *file;
 {
@@ -1440,12 +1494,12 @@ confirm(cmd, file)
        return (*line != 'n' && *line != 'N');
 }
 
        return (*line != 'n' && *line != 'N');
 }
 
+void
 fatal(msg)
        char *msg;
 {
 
 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.
  */
  * Can't control multiple values being expanded
  * from the expression, we return only the first.
  */
+int
 globulize(cpp)
        char **cpp;
 {
 globulize(cpp)
        char **cpp;
 {
@@ -1473,14 +1528,15 @@ globulize(cpp)
        if (globbed) {
                *cpp = *globbed++;
                /* don't waste too much memory */
        if (globbed) {
                *cpp = *globbed++;
                /* don't waste too much memory */
-               if (*globbed) {
-                       blkfree(*globbed);
+               if (globbed) {
+                       blkfree(globbed);
                        free((char *)*globbed);
                }
        }
        return (1);
 }
 
                        free((char *)*globbed);
                }
        }
        return (1);
 }
 
+void
 account(argc,argv)
        int argc;
        char **argv;
 account(argc,argv)
        int argc;
        char **argv;
@@ -1510,7 +1566,6 @@ jmp_buf abortprox;
 void
 proxabort()
 {
 void
 proxabort()
 {
-       extern int proxy;
 
        if (!proxy) {
                pswitch(1);
 
        if (!proxy) {
                pswitch(1);
@@ -1525,16 +1580,13 @@ proxabort()
        longjmp(abortprox,1);
 }
 
        longjmp(abortprox,1);
 }
 
-doproxy(argc,argv)
+void
+doproxy(argc, argv)
        int argc;
        char *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;
        sig_t oldintr;
-       void proxabort();
 
        if (argc < 2 && !another(&argc, &argv, "command")) {
                printf("usage: %s command\n", argv[0]);
 
        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);
 }
 
        (void) signal(SIGINT, oldintr);
 }
 
-setcase()
+void
+setcase(argc, argv)
+       int argc;
+       char *argv[];
 {
 {
+
        mcase = !mcase;
        printf("Case mapping %s.\n", onoff(mcase));
        code = mcase;
 }
 
        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;
 }
 
        crflag = !crflag;
        printf("Carriage Return stripping %s.\n", onoff(crflag));
        code = crflag;
 }
 
+void
 setntrans(argc,argv)
        int argc;
        char *argv[];
 setntrans(argc,argv)
        int argc;
        char *argv[];
@@ -1627,9 +1688,10 @@ dotrans(name)
 {
        static char new[MAXPATHLEN];
        char *cp1, *cp2 = new;
 {
        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++) {
        for (cp1 = name; *cp1; cp1++) {
                found = 0;
                for (i = 0; *(ntin + i) && i < 16; i++) {
@@ -1646,9 +1708,10 @@ dotrans(name)
                }
        }
        *cp2 = '\0';
                }
        }
        *cp2 = '\0';
-       return(new);
+       return (new);
 }
 
 }
 
+void
 setnmap(argc, argv)
        int argc;
        char *argv[];
 setnmap(argc, argv)
        int argc;
        char *argv[];
@@ -1668,15 +1731,17 @@ setnmap(argc, argv)
        }
        mapflag = 1;
        code = 1;
        }
        mapflag = 1;
        code = 1;
-       cp = index(altarg, ' ');
+       cp = strchr(altarg, ' ');
        if (proxy) {
        if (proxy) {
-               while(*++cp == ' ');
+               while(*++cp == ' ')
+                       continue;
                altarg = cp;
                altarg = cp;
-               cp = index(altarg, ' ');
+               cp = strchr(altarg, ' ');
        }
        *cp = '\0';
        (void) strncpy(mapin, altarg, MAXPATHLEN - 1);
        }
        *cp = '\0';
        (void) strncpy(mapin, altarg, MAXPATHLEN - 1);
-       while (*++cp == ' ');
+       while (*++cp == ' ')
+               continue;
        (void) strncpy(mapout, cp, MAXPATHLEN - 1);
 }
 
        (void) strncpy(mapout, cp, MAXPATHLEN - 1);
 }
 
@@ -1685,7 +1750,7 @@ domap(name)
        char *name;
 {
        static char new[MAXPATHLEN];
        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;
 
        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");
                                        }
                                        if (!*cp2) {
                                                printf("nmap: unbalanced brackets\n");
-                                               return(name);
+                                               return (name);
                                        }
                                        match = 1;
                                        cp2--;
                                        }
                                        match = 1;
                                        cp2--;
@@ -1804,7 +1869,7 @@ LOOP:
                                        }
                                        if (!*cp2) {
                                                printf("nmap: unbalanced brackets\n");
                                        }
                                        if (!*cp2) {
                                                printf("nmap: unbalanced brackets\n");
-                                               return(name);
+                                               return (name);
                                        }
                                        break;
                                }
                                        }
                                        break;
                                }
@@ -1845,28 +1910,40 @@ LOOP:
        }
        *cp1 = '\0';
        if (!*new) {
        }
        *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;
 }
 
        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 */
        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");
        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 */
 
 
 /* show remote system type */
-syst()
+void
+syst(argc, argv)
+       int argc;
+       char *argv[];
 {
 {
+
        (void) command("SYST");
 }
 
        (void) command("SYST");
 }
 
+void
 macdef(argc, argv)
        int argc;
        char *argv[];
 macdef(argc, argv)
        int argc;
        char *argv[];
@@ -1944,6 +2026,7 @@ macdef(argc, argv)
 /*
  * get size of file on remote machine
  */
 /*
  * get size of file on remote machine
  */
+void
 sizecmd(argc, argv)
        int argc;
        char *argv[];
 sizecmd(argc, argv)
        int argc;
        char *argv[];
@@ -1960,6 +2043,7 @@ sizecmd(argc, argv)
 /*
  * get last modification time of file on remote machine
  */
 /*
  * get last modification time of file on remote machine
  */
+void
 modtime(argc, argv)
        int argc;
        char *argv[];
 modtime(argc, argv)
        int argc;
        char *argv[];
@@ -1989,9 +2073,11 @@ modtime(argc, argv)
 /*
  * show status on remote machine
  */
 /*
  * show status on remote machine
  */
+void
 rmtstatus(argc, argv)
        int argc;
        char *argv[];
 {
 rmtstatus(argc, argv)
        int argc;
        char *argv[];
 {
+
        (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);
 }
        (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);
 }