=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ftp/ftp.c,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** src/usr.bin/ftp/ftp.c 1997/02/05 04:55:18 1.12 --- src/usr.bin/ftp/ftp.c 1997/03/14 04:32:16 1.13 *************** *** 1,5 **** ! /* $OpenBSD: ftp.c,v 1.12 1997/02/05 04:55:18 millert Exp $ */ ! /* $NetBSD: ftp.c,v 1.22 1997/02/01 10:45:03 lukem Exp $ */ /* * Copyright (c) 1985, 1989, 1993, 1994 --- 1,5 ---- ! /* $OpenBSD: ftp.c,v 1.13 1997/03/14 04:32:16 millert Exp $ */ ! /* $NetBSD: ftp.c,v 1.23 1997/03/13 06:23:17 lukem Exp $ */ /* * Copyright (c) 1985, 1989, 1993, 1994 *************** *** 38,44 **** #if 0 static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94"; #else ! static char rcsid[] = "$OpenBSD: ftp.c,v 1.12 1997/02/05 04:55:18 millert Exp $"; #endif #endif /* not lint */ --- 38,44 ---- #if 0 static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94"; #else ! static char rcsid[] = "$OpenBSD: ftp.c,v 1.13 1997/03/14 04:32:16 millert Exp $"; #endif #endif /* not lint */ *************** *** 63,69 **** --- 63,73 ---- #include #include #include + #ifdef __STDC__ + #include + #else #include + #endif #include "ftp_var.h" *************** *** 300,318 **** /*VARARGS*/ int command(va_alist) ! va_dcl { va_list ap; - char *fmt; int r; sig_t oldintr; abrtflag = 0; if (debug) { fputs("---> ", stdout); va_start(ap); ! fmt = va_arg(ap, char *); if (strncmp("PASS ", fmt, 5) == 0) fputs("PASS XXXX", stdout); else if (strncmp("ACCT ", fmt, 5) == 0) --- 304,332 ---- /*VARARGS*/ int + #ifdef __STDC__ + command(const char *fmt, ...) + #else command(va_alist) ! va_dcl ! #endif { va_list ap; int r; sig_t oldintr; + #ifndef __STDC__ + const char *fmt; + #endif abrtflag = 0; if (debug) { fputs("---> ", stdout); + #ifdef __STDC__ + va_start(ap, fmt); + #else va_start(ap); ! fmt = va_arg(ap, const char *); ! #endif if (strncmp("PASS ", fmt, 5) == 0) fputs("PASS XXXX", stdout); else if (strncmp("ACCT ", fmt, 5) == 0) *************** *** 324,336 **** (void)fflush(stdout); } if (cout == NULL) { ! warn("No control connection for command"); code = -1; return (0); } oldintr = signal(SIGINT, cmdabort); va_start(ap); fmt = va_arg(ap, char *); vfprintf(cout, fmt, ap); va_end(ap); fputs("\r\n", cout); --- 338,354 ---- (void)fflush(stdout); } if (cout == NULL) { ! warnx("No control connection for command."); code = -1; return (0); } oldintr = signal(SIGINT, cmdabort); + #ifdef __STDC__ + va_start(ap, fmt); + #else va_start(ap); fmt = va_arg(ap, char *); + #endif vfprintf(cout, fmt, ap); va_end(ap); fputs("\r\n", cout); *************** *** 391,397 **** lostpeer(); if (verbose) { puts( ! "421 Service not available, remote server has closed connection"); (void)fflush(stdout); } code = 421; --- 409,415 ---- lostpeer(); if (verbose) { puts( ! "421 Service not available, remote server has closed connection."); (void)fflush(stdout); } code = 421; *************** *** 482,488 **** alarmtimer(0); mflag = 0; abrtflag = 0; ! puts("\nsend aborted\nwaiting for remote to finish abort"); (void)fflush(stdout); longjmp(sendabort, 1); } --- 500,506 ---- alarmtimer(0); mflag = 0; abrtflag = 0; ! puts("\nsend aborted\nwaiting for remote to finish abort."); (void)fflush(stdout); longjmp(sendabort, 1); } *************** *** 499,509 **** --- 517,529 ---- sig_t oldinti, oldintr, oldintp; off_t hashbytes; char *lmode, buf[BUFSIZ], *bufp; + int oprogress; hashbytes = mark; direction = "sent"; bytes = 0; filesize = -1; + oprogress = progress; if (verbose && printnames) { if (local && *local != '-') printf("local: %s ", local); *************** *** 535,548 **** (void)signal(SIGPIPE, oldintp); if (oldinti) (void)signal(SIGINFO, oldinti); code = -1; return; } oldintr = signal(SIGINT, abortsend); oldinti = signal(SIGINFO, psummary); ! if (strcmp(local, "-") == 0) fin = stdin; ! else if (*local == '|') { oldintp = signal(SIGPIPE, SIG_IGN); fin = popen(local + 1, "r"); if (fin == NULL) { --- 555,570 ---- (void)signal(SIGPIPE, oldintp); if (oldinti) (void)signal(SIGINFO, oldinti); + progress = oprogress; code = -1; return; } oldintr = signal(SIGINT, abortsend); oldinti = signal(SIGINFO, psummary); ! if (strcmp(local, "-") == 0) { fin = stdin; ! progress = 0; ! } else if (*local == '|') { oldintp = signal(SIGPIPE, SIG_IGN); fin = popen(local + 1, "r"); if (fin == NULL) { *************** *** 553,558 **** --- 575,581 ---- code = -1; return; } + progress = 0; closefunc = pclose; } else { fin = fopen(local, "r"); *************** *** 581,586 **** --- 604,610 ---- if (oldintp) (void)signal(SIGPIPE, oldintp); code = -1; + progress = oprogress; if (closefunc != NULL) (*closefunc)(fin); return; *************** *** 605,610 **** --- 629,635 ---- if (rc < 0) { warn("local: %s", local); restart_point = 0; + progress = oprogress; if (closefunc != NULL) (*closefunc)(fin); return; *************** *** 612,617 **** --- 637,643 ---- if (command("REST %ld", (long) restart_point) != CONTINUE) { restart_point = 0; + progress = oprogress; if (closefunc != NULL) (*closefunc)(fin); return; *************** *** 623,628 **** --- 649,655 ---- if (command("%s %s", cmd, remote) != PRELIM) { (void)signal(SIGINT, oldintr); (void)signal(SIGINFO, oldinti); + progress = oprogress; if (oldintp) (void)signal(SIGPIPE, oldintp); if (closefunc != NULL) *************** *** 633,638 **** --- 660,666 ---- if (command("%s", cmd) != PRELIM) { (void)signal(SIGINT, oldintr); (void)signal(SIGINFO, oldinti); + progress = oprogress; if (oldintp) (void)signal(SIGPIPE, oldintp); if (closefunc != NULL) *************** *** 716,721 **** --- 744,750 ---- break; } progressmeter(1); + progress = oprogress; if (closefunc != NULL) (*closefunc)(fin); (void)fclose(dout); *************** *** 730,735 **** --- 759,765 ---- abort: (void)signal(SIGINT, oldintr); (void)signal(SIGINFO, oldinti); + progress = oprogress; if (oldintp) (void)signal(SIGPIPE, oldintp); if (!cpend) { *************** *** 760,766 **** alarmtimer(0); mflag = 0; abrtflag = 0; ! puts("\nreceive aborted\nwaiting for remote to finish abort"); (void)fflush(stdout); longjmp(recvabort, 1); } --- 790,796 ---- alarmtimer(0); mflag = 0; abrtflag = 0; ! puts("\nreceive aborted\nwaiting for remote to finish abort."); (void)fflush(stdout); longjmp(recvabort, 1); } *************** *** 779,789 **** --- 809,821 ---- off_t hashbytes; struct stat st; time_t mtime; + int oprogress; hashbytes = mark; direction = "received"; bytes = 0; filesize = -1; + oprogress = progress; is_retr = strcmp(cmd, "RETR") == 0; if (is_retr && verbose && printnames) { if (local && *local != '-') *************** *** 897,911 **** din = dataconn("r"); if (din == NULL) goto abort; ! if (strcmp(local, "-") == 0) fout = stdout; ! else if (*local == '|') { oldintp = signal(SIGPIPE, SIG_IGN); fout = popen(local + 1, "w"); if (fout == NULL) { warn("%s", local+1); goto abort; } closefunc = pclose; } else { fout = fopen(local, lmode); --- 929,945 ---- din = dataconn("r"); if (din == NULL) goto abort; ! if (strcmp(local, "-") == 0) { fout = stdout; ! progress = 0; ! } else if (*local == '|') { oldintp = signal(SIGPIPE, SIG_IGN); fout = popen(local + 1, "w"); if (fout == NULL) { warn("%s", local+1); goto abort; } + progress = 0; closefunc = pclose; } else { fout = fopen(local, lmode); *************** *** 928,933 **** --- 962,971 ---- } bufsize = st.st_blksize; } + if (!(st.st_mode & S_IFREG)) { + progress = 0; + preserve = 0; + } progressmeter(-1); switch (curtype) { *************** *** 936,941 **** --- 974,980 ---- if (restart_point && lseek(fileno(fout), restart_point, SEEK_SET) < 0) { warn("local: %s", local); + progress = oprogress; if (closefunc != NULL) (*closefunc)(fout); return; *************** *** 988,993 **** --- 1027,1033 ---- if (fseek(fout, 0L, SEEK_CUR) < 0) { done: warn("local: %s", local); + progress = oprogress; if (closefunc != NULL) (*closefunc)(fout); return; *************** *** 1022,1029 **** } break2: if (bare_lfs) { ! printf("WARNING! %d bare linefeeds received in ASCII mode\n", ! bare_lfs); puts("File may not have transferred correctly."); } if (hash && (!progress || filesize < 0)) { --- 1062,1069 ---- } break2: if (bare_lfs) { ! printf( ! "WARNING! %d bare linefeeds received in ASCII mode.\n", bare_lfs); puts("File may not have transferred correctly."); } if (hash && (!progress || filesize < 0)) { *************** *** 1042,1047 **** --- 1082,1088 ---- break; } progressmeter(1); + progress = oprogress; if (closefunc != NULL) (*closefunc)(fout); (void)signal(SIGINT, oldintr); *************** *** 1061,1076 **** ut.actime = time(NULL); ut.modtime = mtime; if (utime(local, &ut) == -1) ! printf("Can't change modification time on %s to %s", local, asctime(localtime(&mtime))); } } } return; abort: /* abort using RFC959 recommended IP,SYNC sequence */ if (oldintp) (void)signal(SIGPIPE, oldintp); (void)signal(SIGINT, SIG_IGN); --- 1102,1120 ---- ut.actime = time(NULL); ut.modtime = mtime; if (utime(local, &ut) == -1) ! printf( ! "Can't change modification time on %s to %s", local, asctime(localtime(&mtime))); } } } return; + abort: /* abort using RFC959 recommended IP,SYNC sequence */ + progress = oprogress; if (oldintp) (void)signal(SIGPIPE, oldintp); (void)signal(SIGINT, SIG_IGN); *************** *** 1134,1140 **** if (sscanf(pasv, "%d,%d,%d,%d,%d,%d", &a0, &a1, &a2, &a3, &p0, &p1) != 6) { ! puts("Passive mode address scan failure. Shouldn't happen!"); goto bad; } --- 1178,1185 ---- if (sscanf(pasv, "%d,%d,%d,%d,%d,%d", &a0, &a1, &a2, &a3, &p0, &p1) != 6) { ! puts( ! "Passive mode address scan failure. Shouldn't happen!"); goto bad; } *************** *** 1232,1239 **** const char *lmode; { struct sockaddr_in from; ! int s, fromlen = sizeof(from), tos; if (passivemode) return (fdopen(data, lmode)); --- 1277,1286 ---- const char *lmode; { struct sockaddr_in from; ! int s, fromlen, tos; + fromlen = sizeof(from); + if (passivemode) return (fdopen(data, lmode)); *************** *** 1405,1411 **** } pswitch(0); if (!connected) { ! puts("No primary connection"); pswitch(1); code = -1; return; --- 1452,1458 ---- } pswitch(0); if (!connected) { ! puts("No primary connection."); pswitch(1); code = -1; return; *************** *** 1572,1577 **** --- 1619,1632 ---- char buf[BUFSIZ]; int nfnd; struct fd_set mask; + + if (cout == NULL) { + warnx("Lost control connection for abort."); + if (ptabflg) + code = -1; + lostpeer(); + return; + } /* * send IAC in urgent mode instead of DM because 4.3BSD places oob mark