add typedef for signal return for better portability
[unix-history] / usr / src / usr.bin / ftp / ftp.c
index 4b38c26..9f76af4 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)ftp.c      5.27 (Berkeley) %G%";
+static char sccsid[] = "@(#)ftp.c      5.29 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -168,7 +168,7 @@ login(host)
                code = -1;
                return(0);
        }
                code = -1;
                return(0);
        }
-       if (user == NULL) {
+       while (user == NULL) {
                char *myname = getlogin();
 
                if (myname == NULL) {
                char *myname = getlogin();
 
                if (myname == NULL) {
@@ -177,7 +177,10 @@ login(host)
                        if (pp != NULL)
                                myname = pp->pw_name;
                }
                        if (pp != NULL)
                                myname = pp->pw_name;
                }
-               printf("Name (%s:%s): ", host, myname);
+               if (myname)
+                       printf("Name (%s:%s): ", host, myname);
+               else
+                       printf("Name (%s): ", host);
                (void) fgets(tmp, sizeof(tmp) - 1, stdin);
                tmp[strlen(tmp) - 1] = '\0';
                if (*tmp == '\0')
                (void) fgets(tmp, sizeof(tmp) - 1, stdin);
                tmp[strlen(tmp) - 1] = '\0';
                if (*tmp == '\0')
@@ -231,11 +234,15 @@ command(fmt, args)
        char *fmt;
 {
        int r, (*oldintr)(), cmdabort();
        char *fmt;
 {
        int r, (*oldintr)(), cmdabort();
+       char *xxx = "XXX";
 
        abrtflag = 0;
        if (debug) {
                printf("---> ");
 
        abrtflag = 0;
        if (debug) {
                printf("---> ");
-               _doprnt(fmt, &args, stdout);
+               if (strncmp(fmt, "PASS", 4) == 0)
+                       _doprnt(fmt, (int *)&xxx, stdout);
+               else
+                       _doprnt(fmt, &args, stdout);
                printf("\n");
                (void) fflush(stdout);
        }
                printf("\n");
                (void) fflush(stdout);
        }
@@ -410,6 +417,8 @@ sendrequest(cmd, local, remote, printnames)
                proxtrans(cmd, local, remote);
                return;
        }
                proxtrans(cmd, local, remote);
                return;
        }
+       if (curtype != type)
+               changetype(type, 0);
        closefunc = NULL;
        oldintr = NULL;
        oldintp = NULL;
        closefunc = NULL;
        oldintr = NULL;
        oldintp = NULL;
@@ -620,7 +629,7 @@ recvrequest(cmd, local, remote, mode, printnames)
 {
        FILE *fout, *din = 0, *popen();
        int (*closefunc)(), pclose(), fclose(), (*oldintr)(), (*oldintp)(); 
 {
        FILE *fout, *din = 0, *popen();
        int (*closefunc)(), pclose(), fclose(), (*oldintr)(), (*oldintp)(); 
-       int abortrecv(), oldverbose, oldtype = 0, is_retr, tcrflag, nfnd;
+       int abortrecv(), is_retr, tcrflag, nfnd;
        char *bufp, *gunique(), msg;
        static char *buf;
        static int bufsize;
        char *bufp, *gunique(), msg;
        static char *buf;
        static int bufsize;
@@ -701,6 +710,11 @@ recvrequest(cmd, local, remote, mode, printnames)
                        return;
                }
        }
                        return;
                }
        }
+       if (!is_retr) {
+               if (curtype != TYPE_A)
+                       changetype(TYPE_A, 0);
+       } else if (curtype != type)
+               changetype(type, 0);
        if (initconn()) {
                (void) signal(SIGINT, oldintr);
                code = -1;
        if (initconn()) {
                (void) signal(SIGINT, oldintr);
                code = -1;
@@ -708,56 +722,17 @@ recvrequest(cmd, local, remote, mode, printnames)
        }
        if (setjmp(recvabort))
                goto abort;
        }
        if (setjmp(recvabort))
                goto abort;
-       if (!is_retr) {
-               if (type != TYPE_A) {
-                       oldtype = type;
-                       oldverbose = verbose;
-                       if (!debug)
-                               verbose = 0;
-                       setascii();
-                       verbose = oldverbose;
-               }
-       }
+       if (is_retr && restart_point &&
+           command("REST %ld", (long) restart_point) != CONTINUE)
+               return;
        if (remote) {
                if (command("%s %s", cmd, remote) != PRELIM) {
                        (void) signal(SIGINT, oldintr);
        if (remote) {
                if (command("%s %s", cmd, remote) != PRELIM) {
                        (void) signal(SIGINT, oldintr);
-                       if (oldtype) {
-                               if (!debug)
-                                       verbose = 0;
-                               switch (oldtype) {
-                                       case TYPE_I:
-                                               setbinary();
-                                               break;
-                                       case TYPE_E:
-                                               setebcdic();
-                                               break;
-                                       case TYPE_L:
-                                               settenex();
-                                               break;
-                               }
-                               verbose = oldverbose;
-                       }
                        return;
                }
        } else {
                if (command("%s", cmd) != PRELIM) {
                        (void) signal(SIGINT, oldintr);
                        return;
                }
        } else {
                if (command("%s", cmd) != PRELIM) {
                        (void) signal(SIGINT, oldintr);
-                       if (oldtype) {
-                               if (!debug)
-                                       verbose = 0;
-                               switch (oldtype) {
-                                       case TYPE_I:
-                                               setbinary();
-                                               break;
-                                       case TYPE_E:
-                                               setebcdic();
-                                               break;
-                                       case TYPE_L:
-                                               settenex();
-                                               break;
-                               }
-                               verbose = oldverbose;
-                       }
                        return;
                }
        }
                        return;
                }
        }
@@ -797,7 +772,7 @@ recvrequest(cmd, local, remote, mode, printnames)
                bufsize = st.st_blksize;
        }
        (void) gettimeofday(&start, (struct timezone *)0);
                bufsize = st.st_blksize;
        }
        (void) gettimeofday(&start, (struct timezone *)0);
-       switch (type) {
+       switch (curtype) {
 
        case TYPE_I:
        case TYPE_L:
 
        case TYPE_I:
        case TYPE_L:
@@ -887,22 +862,6 @@ break2:
        (void) getreply(0);
        if (bytes > 0 && is_retr)
                ptransfer("received", bytes, &start, &stop);
        (void) getreply(0);
        if (bytes > 0 && is_retr)
                ptransfer("received", bytes, &start, &stop);
-       if (oldtype) {
-               if (!debug)
-                       verbose = 0;
-               switch (oldtype) {
-                       case TYPE_I:
-                               setbinary();
-                               break;
-                       case TYPE_E:
-                               setebcdic();
-                               break;
-                       case TYPE_L:
-                               settenex();
-                               break;
-               }
-               verbose = oldverbose;
-       }
        return;
 abort:
 
        return;
 abort:
 
@@ -912,22 +871,6 @@ abort:
        if (oldintp)
                (void) signal(SIGPIPE, oldintr);
        (void) signal(SIGINT,SIG_IGN);
        if (oldintp)
                (void) signal(SIGPIPE, oldintr);
        (void) signal(SIGINT,SIG_IGN);
-       if (oldtype) {
-               if (!debug)
-                       verbose = 0;
-               switch (oldtype) {
-                       case TYPE_I:
-                               setbinary();
-                               break;
-                       case TYPE_E:
-                               setebcdic();
-                               break;
-                       case TYPE_L:
-                               settenex();
-                               break;
-               }
-               verbose = oldverbose;
-       }
        if (!cpend) {
                code = -1;
                (void) signal(SIGINT,oldintr);
        if (!cpend) {
                code = -1;
                (void) signal(SIGINT,oldintr);
@@ -1128,6 +1071,7 @@ pswitch(flag)
                FILE *in;
                FILE *out;
                int tpe;
                FILE *in;
                FILE *out;
                int tpe;
+               int curtpe;
                int cpnd;
                int sunqe;
                int runqe;
                int cpnd;
                int sunqe;
                int runqe;
@@ -1138,7 +1082,7 @@ pswitch(flag)
                int mapflg;
                char mi[MAXPATHLEN];
                char mo[MAXPATHLEN];
                int mapflg;
                char mi[MAXPATHLEN];
                char mo[MAXPATHLEN];
-               } proxstruct, tmpstruct;
+       } proxstruct, tmpstruct;
        struct comvars *ip, *op;
 
        abrtflag = 0;
        struct comvars *ip, *op;
 
        abrtflag = 0;
@@ -1149,8 +1093,7 @@ pswitch(flag)
                ip = &tmpstruct;
                op = &proxstruct;
                proxy++;
                ip = &tmpstruct;
                op = &proxstruct;
                proxy++;
-       }
-       else {
+       } else {
                if (!proxy)
                        return;
                ip = &proxstruct;
                if (!proxy)
                        return;
                ip = &proxstruct;
@@ -1175,8 +1118,8 @@ pswitch(flag)
        cout = op->out;
        ip->tpe = type;
        type = op->tpe;
        cout = op->out;
        ip->tpe = type;
        type = op->tpe;
-       if (!type)
-               type = 1;
+       ip->curtpe = curtype;
+       curtype = op->curtpe;
        ip->cpnd = cpend;
        cpend = op->cpnd;
        ip->sunqe = sunique;
        ip->cpnd = cpend;
        cpend = op->cpnd;
        ip->sunqe = sunique;
@@ -1224,7 +1167,7 @@ abortpt()
 proxtrans(cmd, local, remote)
        char *cmd, *local, *remote;
 {
 proxtrans(cmd, local, remote)
        char *cmd, *local, *remote;
 {
-       int (*oldintr)(), abortpt(), tmptype, oldtype = 0, secndflag = 0, nfnd;
+       int (*oldintr)(), abortpt(), prox_type, secndflag = 0, nfnd;
        extern jmp_buf ptabort;
        char *cmd2;
        struct fd_set mask;
        extern jmp_buf ptabort;
        char *cmd2;
        struct fd_set mask;
@@ -1233,11 +1176,18 @@ proxtrans(cmd, local, remote)
                cmd2 = "RETR";
        else
                cmd2 = runique ? "STOU" : "STOR";
                cmd2 = "RETR";
        else
                cmd2 = runique ? "STOU" : "STOR";
+       if ((prox_type = type) == 0) {
+               if (unix_server && unix_proxy)
+                       prox_type = TYPE_I;
+               else
+                       prox_type = TYPE_A;
+       }
+       if (curtype != prox_type)
+               changetype(prox_type, 1);
        if (command("PASV") != COMPLETE) {
        if (command("PASV") != COMPLETE) {
-               printf("proxy server does not support third part transfers.\n");
+               printf("proxy server does not support third party transfers.\n");
                return;
        }
                return;
        }
-       tmptype = type;
        pswitch(0);
        if (!connected) {
                printf("No primary connection\n");
        pswitch(0);
        if (!connected) {
                printf("No primary connection\n");
@@ -1245,40 +1195,9 @@ proxtrans(cmd, local, remote)
                code = -1;
                return;
        }
                code = -1;
                return;
        }
-       if (type != tmptype) {
-               oldtype = type;
-               switch (tmptype) {
-                       case TYPE_A:
-                               setascii();
-                               break;
-                       case TYPE_I:
-                               setbinary();
-                               break;
-                       case TYPE_E:
-                               setebcdic();
-                               break;
-                       case TYPE_L:
-                               settenex();
-                               break;
-               }
-       }
+       if (curtype != prox_type)
+               changetype(prox_type, 1);
        if (command("PORT %s", pasv) != COMPLETE) {
        if (command("PORT %s", pasv) != COMPLETE) {
-               switch (oldtype) {
-                       case 0:
-                               break;
-                       case TYPE_A:
-                               setascii();
-                               break;
-                       case TYPE_I:
-                               setbinary();
-                               break;
-                       case TYPE_E:
-                               setebcdic();
-                               break;
-                       case TYPE_L:
-                               settenex();
-                               break;
-               }
                pswitch(1);
                return;
        }
                pswitch(1);
                return;
        }
@@ -1287,22 +1206,6 @@ proxtrans(cmd, local, remote)
        oldintr = signal(SIGINT, abortpt);
        if (command("%s %s", cmd, remote) != PRELIM) {
                (void) signal(SIGINT, oldintr);
        oldintr = signal(SIGINT, abortpt);
        if (command("%s %s", cmd, remote) != PRELIM) {
                (void) signal(SIGINT, oldintr);
-               switch (oldtype) {
-                       case 0:
-                               break;
-                       case TYPE_A:
-                               setascii();
-                               break;
-                       case TYPE_I:
-                               setbinary();
-                               break;
-                       case TYPE_E:
-                               setebcdic();
-                               break;
-                       case TYPE_L:
-                               settenex();
-                               break;
-               }
                pswitch(1);
                return;
        }
                pswitch(1);
                return;
        }
@@ -1316,22 +1219,6 @@ proxtrans(cmd, local, remote)
        pswitch(0);
        (void) getreply(0);
        (void) signal(SIGINT, oldintr);
        pswitch(0);
        (void) getreply(0);
        (void) signal(SIGINT, oldintr);
-       switch (oldtype) {
-               case 0:
-                       break;
-               case TYPE_A:
-                       setascii();
-                       break;
-               case TYPE_I:
-                       setbinary();
-                       break;
-               case TYPE_E:
-                       setebcdic();
-                       break;
-               case TYPE_L:
-                       settenex();
-                       break;
-       }
        pswitch(1);
        ptflag = 0;
        printf("local: %s remote: %s\n", local, remote);
        pswitch(1);
        ptflag = 0;
        printf("local: %s remote: %s\n", local, remote);
@@ -1346,22 +1233,6 @@ abort:
        if (!cpend && !secndflag) {  /* only here if cmd = "STOR" (proxy=1) */
                if (command("%s %s", cmd2, local) != PRELIM) {
                        pswitch(0);
        if (!cpend && !secndflag) {  /* only here if cmd = "STOR" (proxy=1) */
                if (command("%s %s", cmd2, local) != PRELIM) {
                        pswitch(0);
-                       switch (oldtype) {
-                               case 0:
-                                       break;
-                               case TYPE_A:
-                                       setascii();
-                                       break;
-                               case TYPE_I:
-                                       setbinary();
-                                       break;
-                               case TYPE_E:
-                                       setebcdic();
-                                       break;
-                               case TYPE_L:
-                                       settenex();
-                                       break;
-                       }
                        if (cpend) {
                                char msg[2];
 
                        if (cpend) {
                                char msg[2];
 
@@ -1421,22 +1292,6 @@ abort:
        if (!cpend && !secndflag) {  /* only if cmd = "RETR" (proxy=1) */
                if (command("%s %s", cmd2, local) != PRELIM) {
                        pswitch(0);
        if (!cpend && !secndflag) {  /* only if cmd = "RETR" (proxy=1) */
                if (command("%s %s", cmd2, local) != PRELIM) {
                        pswitch(0);
-                       switch (oldtype) {
-                               case 0:
-                                       break;
-                               case TYPE_A:
-                                       setascii();
-                                       break;
-                               case TYPE_I:
-                                       setbinary();
-                                       break;
-                               case TYPE_E:
-                                       setebcdic();
-                                       break;
-                               case TYPE_L:
-                                       settenex();
-                                       break;
-                       }
                        if (cpend) {
                                char msg[2];
 
                        if (cpend) {
                                char msg[2];
 
@@ -1509,22 +1364,6 @@ abort:
        }
        if (proxy)
                pswitch(0);
        }
        if (proxy)
                pswitch(0);
-       switch (oldtype) {
-               case 0:
-                       break;
-               case TYPE_A:
-                       setascii();
-                       break;
-               case TYPE_I:
-                       setbinary();
-                       break;
-               case TYPE_E:
-                       setebcdic();
-                       break;
-               case TYPE_L:
-                       settenex();
-                       break;
-       }
        pswitch(1);
        if (ptabflg)
                code = -1;
        pswitch(1);
        if (ptabflg)
                code = -1;