X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/dce1f2a3eecf34fa874579a079d092a5f286d52b..f59b664716fca2bd38e085ad28391c267b319794:/usr/src/usr.bin/ftp/ftp.c diff --git a/usr/src/usr.bin/ftp/ftp.c b/usr/src/usr.bin/ftp/ftp.c index ea9e32daef..9f76af4b5a 100644 --- a/usr/src/usr.bin/ftp/ftp.c +++ b/usr/src/usr.bin/ftp/ftp.c @@ -16,7 +16,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)ftp.c 5.24.1.2 (Berkeley) %G%"; +static char sccsid[] = "@(#)ftp.c 5.29 (Berkeley) %G%"; #endif /* not lint */ #include @@ -168,7 +168,7 @@ login(host) code = -1; return(0); } - if (user == NULL) { + while (user == NULL) { char *myname = getlogin(); if (myname == NULL) { @@ -177,7 +177,10 @@ login(host) 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') @@ -231,11 +234,15 @@ command(fmt, args) char *fmt; { int r, (*oldintr)(), cmdabort(); + char *xxx = "XXX"; 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); } @@ -256,7 +263,7 @@ command(fmt, args) return(r); } -char reply_string[BUFSIZ]; +char reply_string[BUFSIZ]; /* last line of previous reply */ #include @@ -270,10 +277,10 @@ getreply(expecteof) int pflag = 0; char *pt = pasv; - cp = reply_string; oldintr = signal(SIGINT,cmdabort); for (;;) { dig = n = code = 0; + cp = reply_string; while ((c = getc(cin)) != '\n') { if (c == IAC) { /* handle telnet commands */ switch (c = getc(cin)) { @@ -337,7 +344,8 @@ getreply(expecteof) } if (n == 0) n = c; - *cp++ = c; + if (cp < &reply_string[sizeof(reply_string) - 1]) + *cp++ = c; } if (verbose > 0 || verbose > -1 && n == '5') { (void) putchar(c); @@ -385,8 +393,9 @@ abortsend() #define HASHBYTES 1024 -sendrequest(cmd, local, remote) +sendrequest(cmd, local, remote, printnames) char *cmd, *local, *remote; + int printnames; { FILE *fin, *dout = 0, *popen(); int (*closefunc)(), pclose(), fclose(), (*oldintr)(), (*oldintp)(); @@ -398,10 +407,18 @@ sendrequest(cmd, local, remote) struct timeval start, stop; char *mode; + if (verbose && printnames) { + if (local && *local != '-') + printf("local: %s ", local); + if (remote) + printf("remote: %s\n", remote); + } if (proxy) { proxtrans(cmd, local, remote); return; } + if (curtype != type) + changetype(type, 0); closefunc = NULL; oldintr = NULL; oldintp = NULL; @@ -495,6 +512,9 @@ sendrequest(cmd, local, remote) errno = d = 0; while ((c = read(fileno(fin), buf, sizeof (buf))) > 0) { bytes += c; + for (bufp = buf; c > 0; c -= d, bufp += d) + if ((d = write(fileno(dout), bufp, c)) <= 0) + break; for (bufp = buf; c > 0; c -= d, bufp += d) if ((d = write(fileno(dout), bufp, c)) <= 0) break; @@ -567,7 +587,7 @@ sendrequest(cmd, local, remote) if (oldintp) (void) signal(SIGPIPE, oldintp); if (bytes > 0) - ptransfer("sent", bytes, &start, &stop, local, remote); + ptransfer("sent", bytes, &start, &stop); return; abort: (void) gettimeofday(&stop, (struct timezone *)0); @@ -589,7 +609,7 @@ abort: if (closefunc != NULL && fin != NULL) (*closefunc)(fin); if (bytes > 0) - ptransfer("sent", bytes, &start, &stop, local, remote); + ptransfer("sent", bytes, &start, &stop); } jmp_buf recvabort; @@ -604,13 +624,14 @@ abortrecv() longjmp(recvabort, 1); } -recvrequest(cmd, local, remote, mode) +recvrequest(cmd, local, remote, mode, printnames) char *cmd, *local, *remote, *mode; { FILE *fout, *din = 0, *popen(); int (*closefunc)(), pclose(), fclose(), (*oldintr)(), (*oldintp)(); - int abortrecv(), oldverbose, oldtype = 0, is_retr, tcrflag, nfnd; - char *buf, *bufp, *gunique(), msg; + int abortrecv(), is_retr, tcrflag, nfnd; + char *bufp, *gunique(), msg; + static char *buf; static int bufsize; long bytes = 0, hashbytes = HASHBYTES; struct fd_set mask; @@ -620,6 +641,12 @@ recvrequest(cmd, local, remote, mode) extern char *malloc(); is_retr = strcmp(cmd, "RETR") == 0; + if (is_retr && verbose && printnames) { + if (local && *local != '-') + printf("local: %s ", local); + if (remote) + printf("remote: %s\n", remote); + } if (proxy && is_retr) { proxtrans(cmd, local, remote); return; @@ -683,6 +710,11 @@ recvrequest(cmd, local, remote, mode) 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; @@ -690,56 +722,17 @@ recvrequest(cmd, local, remote, mode) } 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 (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); - 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; } } @@ -772,18 +765,20 @@ recvrequest(cmd, local, remote, mode) buf = malloc(st.st_blksize); if (buf == NULL) { perror("malloc"); + bufsize = 0; + bufsize = 0; goto abort; } bufsize = st.st_blksize; } (void) gettimeofday(&start, (struct timezone *)0); - switch (type) { + switch (curtype) { case TYPE_I: case TYPE_L: errno = d = 0; while ((c = read(fileno(din), buf, bufsize)) > 0) { - if ((d = write(fileno(fout), bufp, c)) != c) + if ((d = write(fileno(fout), buf, c)) != c) break; bytes += c; if (hash) { @@ -832,6 +827,9 @@ recvrequest(cmd, local, remote, mode) } if (c == EOF) goto contin2; + } + if (c == EOF) + goto contin2; } } (void) putc(c, fout); @@ -845,13 +843,13 @@ break2: (void) putchar('\n'); (void) fflush(stdout); } - if (ferror(din)){ + if (ferror(din)) { if (errno != EPIPE) - perror ("netin"); + perror("netin"); bytes = -1; } if (ferror(fout)) - perror (local); + perror(local); break; } if (closefunc != NULL) @@ -863,23 +861,7 @@ break2: (void) fclose(din); (void) getreply(0); if (bytes > 0 && is_retr) - ptransfer("received", bytes, &start, &stop, local, remote); - 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; - } + ptransfer("received", bytes, &start, &stop); return; abort: @@ -889,22 +871,6 @@ abort: 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); @@ -955,7 +921,7 @@ abort: if (din) (void) fclose(din); if (bytes > 0) - ptransfer("received", bytes, &start, &stop, local, remote); + ptransfer("received", bytes, &start, &stop); (void) signal(SIGINT,oldintr); } @@ -1047,8 +1013,8 @@ dataconn(mode) return (fdopen(data, mode)); } -ptransfer(direction, bytes, t0, t1, local, remote) - char *direction, *local, *remote; +ptransfer(direction, bytes, t0, t1) + char *direction; long bytes; struct timeval *t0, *t1; { @@ -1062,11 +1028,6 @@ ptransfer(direction, bytes, t0, t1, local, remote) bs = bytes / nz(s); printf("%ld bytes %s in %.2g seconds (%.2g Kbytes/s)\n", bytes, direction, s, bs / 1024.); - } else { - if (local && *local != '-') - printf("local: %s ", local); - if (remote) - printf("remote: %s\n", remote); } } @@ -1110,6 +1071,7 @@ pswitch(flag) FILE *in; FILE *out; int tpe; + int curtpe; int cpnd; int sunqe; int runqe; @@ -1120,7 +1082,7 @@ pswitch(flag) int mapflg; char mi[MAXPATHLEN]; char mo[MAXPATHLEN]; - } proxstruct, tmpstruct; + } proxstruct, tmpstruct; struct comvars *ip, *op; abrtflag = 0; @@ -1131,8 +1093,7 @@ pswitch(flag) ip = &tmpstruct; op = &proxstruct; proxy++; - } - else { + } else { if (!proxy) return; ip = &proxstruct; @@ -1157,8 +1118,8 @@ pswitch(flag) 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; @@ -1206,7 +1167,7 @@ abortpt() 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; @@ -1215,11 +1176,18 @@ proxtrans(cmd, local, remote) 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) { - printf("proxy server does not support third part transfers.\n"); + printf("proxy server does not support third party transfers.\n"); return; } - tmptype = type; pswitch(0); if (!connected) { printf("No primary connection\n"); @@ -1227,40 +1195,9 @@ proxtrans(cmd, local, remote) 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) { - 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; } @@ -1269,22 +1206,6 @@ proxtrans(cmd, local, remote) 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; } @@ -1298,22 +1219,6 @@ proxtrans(cmd, local, remote) 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); @@ -1328,22 +1233,6 @@ abort: 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]; @@ -1403,22 +1292,6 @@ abort: 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]; @@ -1491,22 +1364,6 @@ abort: } 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;