add 1994 copyright
[unix-history] / usr / src / usr.bin / ftp / ftp.c
index 5e57224..e064bd0 100644 (file)
@@ -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
  *
  * %sccs.include.redist.c%
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)ftp.c      5.34 (Berkeley) %G%";
+static char sccsid[] = "@(#)ftp.c      8.3 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -17,44 +17,51 @@ static char sccsid[] = "@(#)ftp.c   5.34 (Berkeley) %G%";
 #include <sys/file.h>
 
 #include <netinet/in.h>
 #include <sys/file.h>
 
 #include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <arpa/inet.h>
 #include <arpa/ftp.h>
 #include <arpa/telnet.h>
 
 #include <arpa/ftp.h>
 #include <arpa/telnet.h>
 
-#include <stdio.h>
-#include <signal.h>
+#include <ctype.h>
+#include <err.h>
 #include <errno.h>
 #include <errno.h>
-#include <netdb.h>
 #include <fcntl.h>
 #include <fcntl.h>
+#include <netdb.h>
 #include <pwd.h>
 #include <pwd.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 #include <varargs.h>
 
 #include "ftp_var.h"
 
 #include <varargs.h>
 
 #include "ftp_var.h"
 
+extern int h_errno;
+
 struct sockaddr_in hisctladdr;
 struct sockaddr_in data_addr;
 int    data = -1;
 int    abrtflag = 0;
 struct sockaddr_in hisctladdr;
 struct sockaddr_in data_addr;
 int    data = -1;
 int    abrtflag = 0;
+jmp_buf        ptabort;
+int    ptabflg;
 int    ptflag = 0;
 struct sockaddr_in myctladdr;
 int    ptflag = 0;
 struct sockaddr_in myctladdr;
-uid_t  getuid();
-sig_t  lostpeer();
 
 
-extern char *strerror();
-extern int connected, errno;
 
 FILE   *cin, *cout;
 
 FILE   *cin, *cout;
-FILE   *dataconn();
 
 char *
 hookup(host, port)
        char *host;
        int port;
 {
 
 char *
 hookup(host, port)
        char *host;
        int port;
 {
-       register struct hostent *hp = 0;
-       int s,len;
+       struct hostent *hp = 0;
+       int s, len, tos;
        static char hostnamebuf[80];
 
        static char hostnamebuf[80];
 
-       bzero((char *)&hisctladdr, sizeof (hisctladdr));
+       memset((char *)&hisctladdr, 0, sizeof (hisctladdr));
        hisctladdr.sin_addr.s_addr = inet_addr(host);
        if (hisctladdr.sin_addr.s_addr != -1) {
                hisctladdr.sin_family = AF_INET;
        hisctladdr.sin_addr.s_addr = inet_addr(host);
        if (hisctladdr.sin_addr.s_addr != -1) {
                hisctladdr.sin_family = AF_INET;
@@ -62,20 +69,19 @@ hookup(host, port)
        } else {
                hp = gethostbyname(host);
                if (hp == NULL) {
        } else {
                hp = gethostbyname(host);
                if (hp == NULL) {
-                       fprintf(stderr, "ftp: %s: ", host);
-                       herror((char *)NULL);
+                       warnx("%s: %s", host, hstrerror(h_errno));
                        code = -1;
                        code = -1;
-                       return((char *) 0);
+                       return ((char *) 0);
                }
                hisctladdr.sin_family = hp->h_addrtype;
                }
                hisctladdr.sin_family = hp->h_addrtype;
-               bcopy(hp->h_addr_list[0],
-                   (caddr_t)&hisctladdr.sin_addr, hp->h_length);
+               memmove((caddr_t)&hisctladdr.sin_addr,
+                               hp->h_addr_list[0], hp->h_length);
                (void) strncpy(hostnamebuf, hp->h_name, sizeof(hostnamebuf));
        }
        hostname = hostnamebuf;
        s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);
        if (s < 0) {
                (void) strncpy(hostnamebuf, hp->h_name, sizeof(hostnamebuf));
        }
        hostname = hostnamebuf;
        s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);
        if (s < 0) {
-               perror("ftp: socket");
+               warn("socket");
                code = -1;
                return (0);
        }
                code = -1;
                return (0);
        }
@@ -83,40 +89,44 @@ hookup(host, port)
        while (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0) {
                if (hp && hp->h_addr_list[1]) {
                        int oerrno = errno;
        while (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0) {
                if (hp && hp->h_addr_list[1]) {
                        int oerrno = errno;
-                       extern char *inet_ntoa();
+                       char *ia;
 
 
-                       fprintf(stderr, "ftp: connect to address %s: ",
-                               inet_ntoa(hisctladdr.sin_addr));
+                       ia = inet_ntoa(hisctladdr.sin_addr);
                        errno = oerrno;
                        errno = oerrno;
-                       perror((char *) 0);
+                       warn("connect to address %s", ia);
                        hp->h_addr_list++;
                        hp->h_addr_list++;
-                       bcopy(hp->h_addr_list[0],
-                            (caddr_t)&hisctladdr.sin_addr, hp->h_length);
+                       memmove((caddr_t)&hisctladdr.sin_addr,
+                                       hp->h_addr_list[0], hp->h_length);
                        fprintf(stdout, "Trying %s...\n",
                                inet_ntoa(hisctladdr.sin_addr));
                        (void) close(s);
                        s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);
                        if (s < 0) {
                        fprintf(stdout, "Trying %s...\n",
                                inet_ntoa(hisctladdr.sin_addr));
                        (void) close(s);
                        s = socket(hisctladdr.sin_family, SOCK_STREAM, 0);
                        if (s < 0) {
-                               perror("ftp: socket");
+                               warn("socket");
                                code = -1;
                                return (0);
                        }
                        continue;
                }
                                code = -1;
                                return (0);
                        }
                        continue;
                }
-               perror("ftp: connect");
+               warn("connect");
                code = -1;
                goto bad;
        }
        len = sizeof (myctladdr);
        if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) {
                code = -1;
                goto bad;
        }
        len = sizeof (myctladdr);
        if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) {
-               perror("ftp: getsockname");
+               warn("getsockname");
                code = -1;
                goto bad;
        }
                code = -1;
                goto bad;
        }
+#ifdef IP_TOS
+       tos = IPTOS_LOWDELAY;
+       if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0)
+               warn("setsockopt TOS (ignored)");
+#endif
        cin = fdopen(s, "r");
        cout = fdopen(s, "w");
        if (cin == NULL || cout == NULL) {
        cin = fdopen(s, "r");
        cout = fdopen(s, "w");
        if (cin == NULL || cout == NULL) {
-               fprintf(stderr, "ftp: fdopen failed.\n");
+               warnx("fdopen failed.");
                if (cin)
                        (void) fclose(cin);
                if (cout)
                if (cin)
                        (void) fclose(cin);
                if (cout)
@@ -140,7 +150,7 @@ hookup(host, port)
 
        if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on))
                < 0 && debug) {
 
        if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on))
                < 0 && debug) {
-                       perror("ftp: setsockopt");
+                       warn("setsockopt");
                }
        }
 #endif /* SO_OOBINLINE */
                }
        }
 #endif /* SO_OOBINLINE */
@@ -151,17 +161,18 @@ bad:
        return ((char *)0);
 }
 
        return ((char *)0);
 }
 
+int
 login(host)
        char *host;
 {
        char tmp[80];
 login(host)
        char *host;
 {
        char tmp[80];
-       char *user, *pass, *acct, *getlogin(), *getpass();
+       char *user, *pass, *acct;
        int n, aflag = 0;
 
        user = pass = acct = 0;
        if (ruserpass(host, &user, &pass, &acct) < 0) {
                code = -1;
        int n, aflag = 0;
 
        user = pass = acct = 0;
        if (ruserpass(host, &user, &pass, &acct) < 0) {
                code = -1;
-               return(0);
+               return (0);
        }
        while (user == NULL) {
                char *myname = getlogin();
        }
        while (user == NULL) {
                char *myname = getlogin();
@@ -195,13 +206,13 @@ login(host)
                n = command("ACCT %s", acct);
        }
        if (n != COMPLETE) {
                n = command("ACCT %s", acct);
        }
        if (n != COMPLETE) {
-               fprintf(stderr, "Login failed.\n");
+               warnx("Login failed.");
                return (0);
        }
        if (!aflag && acct != NULL)
                (void) command("ACCT %s", acct);
        if (proxy)
                return (0);
        }
        if (!aflag && acct != NULL)
                (void) command("ACCT %s", acct);
        if (proxy)
-               return(1);
+               return (1);
        for (n = 0; n < macnum; ++n) {
                if (!strcmp("init", macros[n].mac_name)) {
                        (void) strcpy(line, "$init");
        for (n = 0; n < macnum; ++n) {
                if (!strcmp("init", macros[n].mac_name)) {
                        (void) strcpy(line, "$init");
@@ -216,7 +227,6 @@ login(host)
 void
 cmdabort()
 {
 void
 cmdabort()
 {
-       extern jmp_buf ptabort;
 
        printf("\n");
        (void) fflush(stdout);
 
        printf("\n");
        (void) fflush(stdout);
@@ -226,6 +236,7 @@ cmdabort()
 }
 
 /*VARARGS*/
 }
 
 /*VARARGS*/
+int
 command(va_alist)
 va_dcl
 {
 command(va_alist)
 va_dcl
 {
@@ -233,7 +244,6 @@ va_dcl
        char *fmt;
        int r;
        sig_t oldintr;
        char *fmt;
        int r;
        sig_t oldintr;
-       void cmdabort();
 
        abrtflag = 0;
        if (debug) {
 
        abrtflag = 0;
        if (debug) {
@@ -249,7 +259,7 @@ va_dcl
                (void) fflush(stdout);
        }
        if (cout == NULL) {
                (void) fflush(stdout);
        }
        if (cout == NULL) {
-               perror ("No control connection for command");
+               warn("No control connection for command");
                code = -1;
                return (0);
        }
                code = -1;
                return (0);
        }
@@ -263,26 +273,23 @@ va_dcl
        cpend = 1;
        r = getreply(!strcmp(fmt, "QUIT"));
        if (abrtflag && oldintr != SIG_IGN)
        cpend = 1;
        r = getreply(!strcmp(fmt, "QUIT"));
        if (abrtflag && oldintr != SIG_IGN)
-               (*oldintr)();
+               (*oldintr)(SIGINT);
        (void) signal(SIGINT, oldintr);
        (void) signal(SIGINT, oldintr);
-       return(r);
+       return (r);
 }
 
 char reply_string[BUFSIZ];             /* last line of previous reply */
 
 }
 
 char reply_string[BUFSIZ];             /* last line of previous reply */
 
-#include <ctype.h>
-
+int
 getreply(expecteof)
        int expecteof;
 {
 getreply(expecteof)
        int expecteof;
 {
-       register int c, n;
-       register int dig;
-       register char *cp;
+       int c, n;
+       int dig;
        int originalcode = 0, continuation = 0;
        sig_t oldintr;
        int pflag = 0;
        int originalcode = 0, continuation = 0;
        sig_t oldintr;
        int pflag = 0;
-       char *pt = pasv;
-       void cmdabort();
+       char *cp, *pt = pasv;
 
        oldintr = signal(SIGINT, cmdabort);
        for (;;) {
 
        oldintr = signal(SIGINT, cmdabort);
        for (;;) {
@@ -321,7 +328,7 @@ getreply(expecteof)
                                        (void) fflush(stdout);
                                }
                                code = 421;
                                        (void) fflush(stdout);
                                }
                                code = 421;
-                               return(4);
+                               return (4);
                        }
                        if (c != '\r' && (verbose > 0 ||
                            (verbose > -1 && n == '5' && dig > 4))) {
                        }
                        if (c != '\r' && (verbose > 0 ||
                            (verbose > -1 && n == '5' && dig > 4))) {
@@ -370,11 +377,12 @@ getreply(expecteof)
                if (code == 421 || originalcode == 421)
                        lostpeer();
                if (abrtflag && oldintr != cmdabort && oldintr != SIG_IGN)
                if (code == 421 || originalcode == 421)
                        lostpeer();
                if (abrtflag && oldintr != cmdabort && oldintr != SIG_IGN)
-                       (*oldintr)();
+                       (*oldintr)(SIGINT);
                return (n - '0');
        }
 }
 
                return (n - '0');
        }
 }
 
+int
 empty(mask, sec)
        struct fd_set *mask;
        int sec;
 empty(mask, sec)
        struct fd_set *mask;
        int sec;
@@ -383,7 +391,7 @@ empty(mask, sec)
 
        t.tv_sec = (long) sec;
        t.tv_usec = 0;
 
        t.tv_sec = (long) sec;
        t.tv_usec = 0;
-       return(select(32, mask, (struct fd_set *) 0, (struct fd_set *) 0, &t));
+       return (select(32, mask, (struct fd_set *) 0, (struct fd_set *) 0, &t));
 }
 
 jmp_buf        sendabort;
 }
 
 jmp_buf        sendabort;
@@ -401,19 +409,19 @@ abortsend()
 
 #define HASHBYTES 1024
 
 
 #define HASHBYTES 1024
 
+void
 sendrequest(cmd, local, remote, printnames)
        char *cmd, *local, *remote;
        int printnames;
 {
        struct stat st;
        struct timeval start, stop;
 sendrequest(cmd, local, remote, printnames)
        char *cmd, *local, *remote;
        int printnames;
 {
        struct stat st;
        struct timeval start, stop;
-       register int c, d;
+       int c, d;
        FILE *fin, *dout = 0, *popen();
        FILE *fin, *dout = 0, *popen();
-       int (*closefunc)(), pclose(), fclose();
+       int (*closefunc) __P((FILE *));
        char buf[BUFSIZ], *bufp;
        long bytes = 0, hashbytes = HASHBYTES;
        char *lmode, buf[BUFSIZ], *bufp;
        char buf[BUFSIZ], *bufp;
        long bytes = 0, hashbytes = HASHBYTES;
        char *lmode, buf[BUFSIZ], *bufp;
-       void abortsend();
 
        if (verbose && printnames) {
                if (local && *local != '-')
 
        if (verbose && printnames) {
                if (local && *local != '-')
@@ -453,7 +461,7 @@ sendrequest(cmd, local, remote, printnames)
                oldintp = signal(SIGPIPE,SIG_IGN);
                fin = popen(local + 1, "r");
                if (fin == NULL) {
                oldintp = signal(SIGPIPE,SIG_IGN);
                fin = popen(local + 1, "r");
                if (fin == NULL) {
-                       perror(local + 1);
+                       warn("%s", local + 1);
                        (void) signal(SIGINT, oldintr);
                        (void) signal(SIGPIPE, oldintp);
                        code = -1;
                        (void) signal(SIGINT, oldintr);
                        (void) signal(SIGPIPE, oldintp);
                        code = -1;
@@ -463,8 +471,7 @@ sendrequest(cmd, local, remote, printnames)
        } else {
                fin = fopen(local, "r");
                if (fin == NULL) {
        } else {
                fin = fopen(local, "r");
                if (fin == NULL) {
-                       fprintf(stderr, "local: %s: %s\n", local,
-                               strerror(errno));
+                       warn("local: %s", local);
                        (void) signal(SIGINT, oldintr);
                        code = -1;
                        return;
                        (void) signal(SIGINT, oldintr);
                        code = -1;
                        return;
@@ -542,13 +549,12 @@ sendrequest(cmd, local, remote, printnames)
                        (void) fflush(stdout);
                }
                if (c < 0)
                        (void) fflush(stdout);
                }
                if (c < 0)
-                       fprintf(stderr, "local: %s: %s\n", local,
-                               strerror(errno));
+                       warn("local: %s", local);
                if (d <= 0) {
                        if (d == 0)
                                fprintf(stderr, "netout: write returned 0?\n");
                        else if (errno != EPIPE) 
                if (d <= 0) {
                        if (d == 0)
                                fprintf(stderr, "netout: write returned 0?\n");
                        else if (errno != EPIPE) 
-                               perror("netout");
+                               warn("netout");
                        bytes = -1;
                }
                break;
                        bytes = -1;
                }
                break;
@@ -569,7 +575,7 @@ sendrequest(cmd, local, remote, printnames)
                        (void) putc(c, dout);
                        bytes++;
        /*              if (c == '\r') {                                */
                        (void) putc(c, dout);
                        bytes++;
        /*              if (c == '\r') {                                */
-       /*              (void)  putc('\0', dout);  /* this violates rfc */
+       /*              (void)  putc('\0', dout);  // this violates rfc */
        /*                      bytes++;                                */
        /*              }                                               */      
                }
        /*                      bytes++;                                */
        /*              }                                               */      
                }
@@ -580,11 +586,10 @@ sendrequest(cmd, local, remote, printnames)
                        (void) fflush(stdout);
                }
                if (ferror(fin))
                        (void) fflush(stdout);
                }
                if (ferror(fin))
-                       fprintf(stderr, "local: %s: %s\n", local,
-                               strerror(errno));
+                       warn("local: %s", local);
                if (ferror(dout)) {
                        if (errno != EPIPE)
                if (ferror(dout)) {
                        if (errno != EPIPE)
-                               perror("netout");
+                               warn("netout");
                        bytes = -1;
                }
                break;
                        bytes = -1;
                }
                break;
@@ -636,21 +641,18 @@ abortrecv()
        longjmp(recvabort, 1);
 }
 
        longjmp(recvabort, 1);
 }
 
+void
 recvrequest(cmd, local, remote, lmode, printnames)
        char *cmd, *local, *remote, *lmode;
 recvrequest(cmd, local, remote, lmode, printnames)
        char *cmd, *local, *remote, *lmode;
+       int printnames;
 {
 {
-       FILE *fout, *din = 0, *popen();
        char *bufp, *gunique(), msg;
        static char *buf;
        static int bufsize;
        static char *buf;
        long bytes = 0, hashbytes = HASHBYTES;
        char *bufp, *gunique(), msg;
        static char *buf;
        static int bufsize;
        static char *buf;
        long bytes = 0, hashbytes = HASHBYTES;
-       register int c, d;
        struct timeval start, stop;
        struct stat st;
        struct timeval start, stop;
        struct stat st;
-       off_t lseek();
-       void abortrecv();
-       char *malloc();
 
        is_retr = strcmp(cmd, "RETR") == 0;
        if (is_retr && verbose && printnames) {
 
        is_retr = strcmp(cmd, "RETR") == 0;
        if (is_retr && verbose && printnames) {
@@ -683,11 +685,10 @@ recvrequest(cmd, local, remote, lmode, printnames)
        oldintr = signal(SIGINT, abortrecv);
        if (strcmp(local, "-") && *local != '|') {
                if (access(local, 2) < 0) {
        oldintr = signal(SIGINT, abortrecv);
        if (strcmp(local, "-") && *local != '|') {
                if (access(local, 2) < 0) {
-                       char *dir = rindex(local, '/');
+                       char *dir = strrchr(local, '/');
 
                        if (errno != ENOENT && errno != EACCES) {
 
                        if (errno != ENOENT && errno != EACCES) {
-                               fprintf(stderr, "local: %s: %s\n", local,
-                                       strerror(errno));
+                               warn("local: %s", local);
                                (void) signal(SIGINT, oldintr);
                                code = -1;
                                return;
                                (void) signal(SIGINT, oldintr);
                                code = -1;
                                return;
@@ -698,16 +699,14 @@ recvrequest(cmd, local, remote, lmode, printnames)
                        if (dir != NULL)
                                *dir = '/';
                        if (d < 0) {
                        if (dir != NULL)
                                *dir = '/';
                        if (d < 0) {
-                               fprintf(stderr, "local: %s: %s\n", local,
-                                       strerror(errno));
+                               warn("local: %s", local);
                                (void) signal(SIGINT, oldintr);
                                code = -1;
                                return;
                        }
                        if (!runique && errno == EACCES &&
                            chmod(local, 0600) < 0) {
                                (void) signal(SIGINT, oldintr);
                                code = -1;
                                return;
                        }
                        if (!runique && errno == EACCES &&
                            chmod(local, 0600) < 0) {
-                               fprintf(stderr, "local: %s: %s\n", local,
-                                       strerror(errno));
+                               warn("local: %s", local);
                                (void) signal(SIGINT, oldintr);
                                (void) signal(SIGINT, oldintr);
                                code = -1;
                                (void) signal(SIGINT, oldintr);
                                (void) signal(SIGINT, oldintr);
                                code = -1;
@@ -761,15 +760,14 @@ recvrequest(cmd, local, remote, lmode, printnames)
                oldintp = signal(SIGPIPE, SIG_IGN);
                fout = popen(local + 1, "w");
                if (fout == NULL) {
                oldintp = signal(SIGPIPE, SIG_IGN);
                fout = popen(local + 1, "w");
                if (fout == NULL) {
-                       perror(local+1);
+                       warn("%s", local+1);
                        goto abort;
                }
                closefunc = pclose;
        } else {
                fout = fopen(local, lmode);
                if (fout == NULL) {
                        goto abort;
                }
                closefunc = pclose;
        } else {
                fout = fopen(local, lmode);
                if (fout == NULL) {
-                       fprintf(stderr, "local: %s: %s\n", local,
-                               strerror(errno));
+                       warn("local: %s", local);
                        goto abort;
                }
                closefunc = fclose;
                        goto abort;
                }
                closefunc = fclose;
@@ -781,7 +779,7 @@ recvrequest(cmd, local, remote, lmode, printnames)
                        (void) free(buf);
                buf = malloc((unsigned)st.st_blksize);
                if (buf == NULL) {
                        (void) free(buf);
                buf = malloc((unsigned)st.st_blksize);
                if (buf == NULL) {
-                       perror("malloc");
+                       warn("malloc");
                        bufsize = 0;
                        bufsize = 0;
                        goto abort;
                        bufsize = 0;
                        bufsize = 0;
                        goto abort;
@@ -814,7 +812,7 @@ recvrequest(cmd, local, remote, lmode, printnames)
                }
                if (c < 0) {
                        if (errno != EPIPE)
                }
                if (c < 0) {
                        if (errno != EPIPE)
-                               perror("netin");
+                               warn("netin");
                        bytes = -1;
                }
                if (d < c) {
                        bytes = -1;
                }
                if (d < c) {
@@ -868,12 +866,11 @@ break2:
                }
                if (ferror(din)) {
                        if (errno != EPIPE)
                }
                if (ferror(din)) {
                        if (errno != EPIPE)
-                               perror("netin");
+                               warn("netin");
                        bytes = -1;
                }
                if (ferror(fout))
                        bytes = -1;
                }
                if (ferror(fout))
-                       fprintf(stderr, "local: %s: %s\n", local,
-                               strerror(errno));
+                       warn("local: %s", local);
                break;
        }
        if (closefunc != NULL)
                break;
        }
        if (closefunc != NULL)
@@ -920,9 +917,10 @@ abort:
  * Need to start a listen on the data channel before we send the command,
  * otherwise the server's connect may fail.
  */
  * Need to start a listen on the data channel before we send the command,
  * otherwise the server's connect may fail.
  */
+int
 initconn()
 {
 initconn()
 {
-       register char *p, *a;
+       char *p, *a;
        int result, len, tmpno = 0;
        int on = 1;
 
        int result, len, tmpno = 0;
        int on = 1;
 
@@ -934,30 +932,30 @@ noport:
                (void) close(data);
        data = socket(AF_INET, SOCK_STREAM, 0);
        if (data < 0) {
                (void) close(data);
        data = socket(AF_INET, SOCK_STREAM, 0);
        if (data < 0) {
-               perror("ftp: socket");
+               warn("socket");
                if (tmpno)
                        sendport = 1;
                return (1);
        }
        if (!sendport)
                if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {
                if (tmpno)
                        sendport = 1;
                return (1);
        }
        if (!sendport)
                if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {
-                       perror("ftp: setsockopt (reuse address)");
+                       warn("setsockopt (reuse address)");
                        goto bad;
                }
        if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {
                        goto bad;
                }
        if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {
-               perror("ftp: bind");
+               warn("bind");
                goto bad;
        }
        if (options & SO_DEBUG &&
            setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)
                goto bad;
        }
        if (options & SO_DEBUG &&
            setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)
-               perror("ftp: setsockopt (ignored)");
+               warn("setsockopt (ignored)");
        len = sizeof (data_addr);
        if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {
        len = sizeof (data_addr);
        if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {
-               perror("ftp: getsockname");
+               warn("getsockname");
                goto bad;
        }
        if (listen(data, 1) < 0)
                goto bad;
        }
        if (listen(data, 1) < 0)
-               perror("ftp: listen");
+               warn("listen");
        if (sendport) {
                a = (char *)&data_addr.sin_addr;
                p = (char *)&data_addr.sin_port;
        if (sendport) {
                a = (char *)&data_addr.sin_addr;
                p = (char *)&data_addr.sin_port;
@@ -975,6 +973,11 @@ noport:
        }
        if (tmpno)
                sendport = 1;
        }
        if (tmpno)
                sendport = 1;
+#ifdef IP_TOS
+       on = IPTOS_THROUGHPUT;
+       if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on, sizeof(int)) < 0)
+               warn("setsockopt TOS (ignored)");
+#endif
        return (0);
 bad:
        (void) close(data), data = -1;
        return (0);
 bad:
        (void) close(data), data = -1;
@@ -988,19 +991,25 @@ dataconn(lmode)
        char *lmode;
 {
        struct sockaddr_in from;
        char *lmode;
 {
        struct sockaddr_in from;
-       int s, fromlen = sizeof (from);
+       int s, fromlen = sizeof (from), tos;
 
        s = accept(data, (struct sockaddr *) &from, &fromlen);
        if (s < 0) {
 
        s = accept(data, (struct sockaddr *) &from, &fromlen);
        if (s < 0) {
-               perror("ftp: accept");
+               warn("accept");
                (void) close(data), data = -1;
                return (NULL);
        }
        (void) close(data);
        data = s;
                (void) close(data), data = -1;
                return (NULL);
        }
        (void) close(data);
        data = s;
+#ifdef IP_TOS
+       tos = IPTOS_THROUGHPUT;
+       if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0)
+               warn("setsockopt TOS (ignored)");
+#endif
        return (fdopen(data, lmode));
 }
 
        return (fdopen(data, lmode));
 }
 
+void
 ptransfer(direction, bytes, t0, t1)
        char *direction;
        long bytes;
 ptransfer(direction, bytes, t0, t1)
        char *direction;
        long bytes;
@@ -1019,7 +1028,9 @@ ptransfer(direction, bytes, t0, t1)
        }
 }
 
        }
 }
 
-/*tvadd(tsum, t0)
+/*
+void
+tvadd(tsum, t0)
        struct timeval *tsum, *t0;
 {
 
        struct timeval *tsum, *t0;
 {
 
@@ -1027,8 +1038,10 @@ ptransfer(direction, bytes, t0, t1)
        tsum->tv_usec += t0->tv_usec;
        if (tsum->tv_usec > 1000000)
                tsum->tv_sec++, tsum->tv_usec -= 1000000;
        tsum->tv_usec += t0->tv_usec;
        if (tsum->tv_usec > 1000000)
                tsum->tv_sec++, tsum->tv_usec -= 1000000;
-} */
+}
+*/
 
 
+void
 tvsub(tdiff, t1, t0)
        struct timeval *tdiff, *t1, *t0;
 {
 tvsub(tdiff, t1, t0)
        struct timeval *tdiff, *t1, *t0;
 {
@@ -1042,15 +1055,14 @@ tvsub(tdiff, t1, t0)
 void
 psabort()
 {
 void
 psabort()
 {
-       extern int abrtflag;
 
        abrtflag++;
 }
 
 
        abrtflag++;
 }
 
+void
 pswitch(flag)
        int flag;
 {
 pswitch(flag)
        int flag;
 {
-       extern int proxy, abrtflag;
        sig_t oldintr;
        static struct comvars {
                int connect;
        sig_t oldintr;
        static struct comvars {
                int connect;
@@ -1136,16 +1148,14 @@ pswitch(flag)
        (void) signal(SIGINT, oldintr);
        if (abrtflag) {
                abrtflag = 0;
        (void) signal(SIGINT, oldintr);
        if (abrtflag) {
                abrtflag = 0;
-               (*oldintr)();
+               (*oldintr)(SIGINT);
        }
 }
 
        }
 }
 
-jmp_buf ptabort;
-int ptabflg;
-
 void
 abortpt()
 {
 void
 abortpt()
 {
+
        printf("\n");
        (void) fflush(stdout);
        ptabflg++;
        printf("\n");
        (void) fflush(stdout);
        ptabflg++;
@@ -1154,15 +1164,14 @@ abortpt()
        longjmp(ptabort, 1);
 }
 
        longjmp(ptabort, 1);
 }
 
+void
 proxtrans(cmd, local, remote)
        char *cmd, *local, *remote;
 {
        sig_t oldintr;
        int secndflag = 0, prox_type, nfnd;
 proxtrans(cmd, local, remote)
        char *cmd, *local, *remote;
 {
        sig_t oldintr;
        int secndflag = 0, prox_type, nfnd;
-       extern jmp_buf ptabort;
        char *cmd2;
        struct fd_set mask;
        char *cmd2;
        struct fd_set mask;
-       void abortpt();
 
        if (strcmp(cmd, "RETR"))
                cmd2 = "RETR";
 
        if (strcmp(cmd, "RETR"))
                cmd2 = "RETR";
@@ -1257,7 +1266,7 @@ abort:
                FD_SET(fileno(cin), &mask);
                if ((nfnd = empty(&mask, 10)) <= 0) {
                        if (nfnd < 0) {
                FD_SET(fileno(cin), &mask);
                if ((nfnd = empty(&mask, 10)) <= 0) {
                        if (nfnd < 0) {
-                               perror("abort");
+                               warn("abort");
                        }
                        if (ptabflg)
                                code = -1;
                        }
                        if (ptabflg)
                                code = -1;
@@ -1274,7 +1283,10 @@ abort:
        (void) signal(SIGINT, oldintr);
 }
 
        (void) signal(SIGINT, oldintr);
 }
 
-reset()
+void
+reset(argc, argv)
+       int argc;
+       char *argv[];
 {
        struct fd_set mask;
        int nfnd = 1;
 {
        struct fd_set mask;
        int nfnd = 1;
@@ -1283,7 +1295,7 @@ reset()
        while (nfnd > 0) {
                FD_SET(fileno(cin), &mask);
                if ((nfnd = empty(&mask,0)) < 0) {
        while (nfnd > 0) {
                FD_SET(fileno(cin), &mask);
                if ((nfnd = empty(&mask,0)) < 0) {
-                       perror("reset");
+                       warn("reset");
                        code = -1;
                        lostpeer();
                }
                        code = -1;
                        lostpeer();
                }
@@ -1298,7 +1310,7 @@ gunique(local)
        char *local;
 {
        static char new[MAXPATHLEN];
        char *local;
 {
        static char new[MAXPATHLEN];
-       char *cp = rindex(local, '/');
+       char *cp = strrchr(local, '/');
        int d, count=0;
        char ext = '1';
 
        int d, count=0;
        char ext = '1';
 
@@ -1308,8 +1320,8 @@ gunique(local)
        if (cp)
                *cp = '/';
        if (d < 0) {
        if (cp)
                *cp = '/';
        if (d < 0) {
-               fprintf(stderr, "local: %s: %s\n", local, strerror(errno));
-               return((char *) 0);
+               warn("local: %s", local);
+               return ((char *) 0);
        }
        (void) strcpy(new, local);
        cp = new + strlen(new);
        }
        (void) strcpy(new, local);
        cp = new + strlen(new);
@@ -1317,7 +1329,7 @@ gunique(local)
        while (!d) {
                if (++count == 100) {
                        printf("runique: can't find unique file name.\n");
        while (!d) {
                if (++count == 100) {
                        printf("runique: can't find unique file name.\n");
-                       return((char *) 0);
+                       return ((char *) 0);
                }
                *cp++ = ext;
                *cp = '\0';
                }
                *cp++ = ext;
                *cp = '\0';
@@ -1336,11 +1348,12 @@ gunique(local)
                        cp--;
                }
        }
                        cp--;
                }
        }
-       return(new);
+       return (new);
 }
 
 }
 
+void
 abort_remote(din)
 abort_remote(din)
-FILE *din;
+       FILE *din;
 {
        char buf[BUFSIZ];
        int nfnd;
 {
        char buf[BUFSIZ];
        int nfnd;
@@ -1352,7 +1365,7 @@ FILE *din;
         */
        sprintf(buf, "%c%c%c", IAC, IP, IAC);
        if (send(fileno(cout), buf, 3, MSG_OOB) != 3)
         */
        sprintf(buf, "%c%c%c", IAC, IP, IAC);
        if (send(fileno(cout), buf, 3, MSG_OOB) != 3)
-               perror("abort");
+               warn("abort");
        fprintf(cout,"%cABOR\r\n", DM);
        (void) fflush(cout);
        FD_ZERO(&mask);
        fprintf(cout,"%cABOR\r\n", DM);
        (void) fflush(cout);
        FD_ZERO(&mask);
@@ -1362,7 +1375,7 @@ FILE *din;
        }
        if ((nfnd = empty(&mask, 10)) <= 0) {
                if (nfnd < 0) {
        }
        if ((nfnd = empty(&mask, 10)) <= 0) {
                if (nfnd < 0) {
-                       perror("abort");
+                       warn("abort");
                }
                if (ptabflg)
                        code = -1;
                }
                if (ptabflg)
                        code = -1;