Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/ftp ftp: don't use restartable signals



details:   https://anonhg.NetBSD.org/src/rev/08bbf805fc4b
branches:  trunk
changeset: 949230:08bbf805fc4b
user:      lukem <lukem%NetBSD.org@localhost>
date:      Wed Jan 06 04:43:14 2021 +0000

description:
ftp: don't use restartable signals

Refactor to not rely upon restartable signals (SA_RESTART),
possibly fixing intermittent failures with -q QUITTIME.

ftp transfers: handle EINTR/EAGAIN in copy_bytes(),
instead of relying upon restartable signals.

http/https transfers: Explicitly print an error similar to
progressmeter() when timing-out for -Q QUITTIME in fetch_wait(),
and set errno to ETIMEDOUT so that the warn() in fetch_url()
prints a more accurate error message.

PR/55857

diffstat:

 usr.bin/ftp/ftp.c         |  22 ++++++++++----
 usr.bin/ftp/progressbar.c |  70 ++++++----------------------------------------
 usr.bin/ftp/progressbar.h |   5 +--
 usr.bin/ftp/ssl.c         |   8 ++++-
 usr.bin/ftp/version.h     |   6 ++--
 5 files changed, 36 insertions(+), 75 deletions(-)

diffs (239 lines):

diff -r a8a31a87d992 -r 08bbf805fc4b usr.bin/ftp/ftp.c
--- a/usr.bin/ftp/ftp.c Tue Jan 05 23:50:29 2021 +0000
+++ b/usr.bin/ftp/ftp.c Wed Jan 06 04:43:14 2021 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: ftp.c,v 1.170 2020/07/11 02:19:31 lukem Exp $  */
+/*     $NetBSD: ftp.c,v 1.171 2021/01/06 04:43:14 lukem Exp $  */
 
 /*-
- * Copyright (c) 1996-2020 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2021 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -92,7 +92,7 @@
 #if 0
 static char sccsid[] = "@(#)ftp.c      8.6 (Berkeley) 10/27/94";
 #else
-__RCSID("$NetBSD: ftp.c,v 1.170 2020/07/11 02:19:31 lukem Exp $");
+__RCSID("$NetBSD: ftp.c,v 1.171 2021/01/06 04:43:14 lukem Exp $");
 #endif
 #endif /* not lint */
 
@@ -593,7 +593,7 @@
 
 /*
  * Read data from infd & write to outfd, using buf/bufsize as the temporary
- * buffer, dealing with short writes.
+ * buffer, dealing with short reads or writes.
  * If rate_limit != 0, rate-limit the transfer.
  * If hash_interval != 0, fputc('c', ttyout) every hash_interval bytes.
  * Updates global variables: bytes.
@@ -627,15 +627,25 @@
                bufrem = bufchunk;
                while (bufrem > 0) {
                        inc = read(infd, buf, MIN((off_t)bufsize, bufrem));
-                       if (inc <= 0)
+                       if (inc < 0) {
+                               if (errno == EINTR || errno == EAGAIN) {
+                                       continue;
+                               }
                                goto copy_done;
+                       } else if (inc == 0) {
+                               goto copy_done;
+                       }
                        bytes += inc;
                        bufrem -= inc;
                        bufp = buf;
                        while (inc > 0) {
                                outc = write(outfd, bufp, inc);
-                               if (outc < 0)
+                               if (outc < 0) {
+                                       if (errno == EINTR || errno == EAGAIN) {
+                                               continue;
+                                       }
                                        goto copy_done;
+                               }
                                inc -= outc;
                                bufp += outc;
                        }
diff -r a8a31a87d992 -r 08bbf805fc4b usr.bin/ftp/progressbar.c
--- a/usr.bin/ftp/progressbar.c Tue Jan 05 23:50:29 2021 +0000
+++ b/usr.bin/ftp/progressbar.c Wed Jan 06 04:43:14 2021 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: progressbar.c,v 1.23 2019/06/22 23:40:33 christos Exp $        */
+/*     $NetBSD: progressbar.c,v 1.24 2021/01/06 04:43:14 lukem Exp $   */
 
 /*-
- * Copyright (c) 1997-2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997-2021 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: progressbar.c,v 1.23 2019/06/22 23:40:33 christos Exp $");
+__RCSID("$NetBSD: progressbar.c,v 1.24 2021/01/06 04:43:14 lukem Exp $");
 #endif /* not lint */
 
 /*
@@ -193,7 +193,7 @@
        if (quit_time > 0 || progress) {
 #endif /* !STANDALONE_PROGRESS */
                if (flag == -1) {
-                       (void)xsignal_restart(SIGALRM, updateprogressmeter, 1);
+                       (void)xsignal(SIGALRM, updateprogressmeter);
                        alarmtimer(1);          /* set alarm timer for 1 Hz */
                } else if (flag == 1) {
                        alarmtimer(0);
@@ -404,73 +404,21 @@
        setitimer(ITIMER_REAL, &itv, NULL);
 }
 
-
 /*
- * Install a POSIX signal handler, allowing the invoker to set whether
- * the signal should be restartable or not
+ * Install a non-restartable POSIX signal handler.
  */
 sigfunc
-xsignal_restart(int sig, sigfunc func, int restartable)
+xsignal(int sig, sigfunc func)
 {
        struct sigaction act, oact;
        act.sa_handler = func;
 
        sigemptyset(&act.sa_mask);
-#if defined(SA_RESTART)                        /* 4.4BSD, Posix(?), SVR4 */
-       act.sa_flags = restartable ? SA_RESTART : 0;
-#elif defined(SA_INTERRUPT)            /* SunOS 4.x */
-       act.sa_flags = restartable ? 0 : SA_INTERRUPT;
-#else
-#error "system must have SA_RESTART or SA_INTERRUPT"
+       act.sa_flags = 0;
+#if defined(SA_INTERRUPT)              /* SunOS 4.x */
+       act.sa_flags = SA_INTERRUPT;
 #endif
        if (sigaction(sig, &act, &oact) < 0)
                return (SIG_ERR);
        return (oact.sa_handler);
 }
-
-/*
- * Install a signal handler with the `restartable' flag set dependent upon
- * which signal is being set. (This is a wrapper to xsignal_restart())
- */
-sigfunc
-xsignal(int sig, sigfunc func)
-{
-       int restartable;
-
-       /*
-        * Some signals print output or change the state of the process.
-        * There should be restartable, so that reads and writes are
-        * not affected.  Some signals should cause program flow to change;
-        * these signals should not be restartable, so that the system call
-        * will return with EINTR, and the program will go do something
-        * different.  If the signal handler calls longjmp() or siglongjmp(),
-        * it doesn't matter if it's restartable.
-        */
-
-       switch(sig) {
-#ifdef SIGINFO
-       case SIGINFO:
-#endif
-       case SIGQUIT:
-       case SIGUSR1:
-       case SIGUSR2:
-       case SIGWINCH:
-               restartable = 1;
-               break;
-
-       case SIGALRM:
-       case SIGINT:
-       case SIGPIPE:
-               restartable = 0;
-               break;
-
-       default:
-               /*
-                * This is unpleasant, but I don't know what would be better.
-                * Right now, this "can't happen"
-                */
-               errx(1, "xsignal_restart: called with signal %d", sig);
-       }
-
-       return(xsignal_restart(sig, func, restartable));
-}
diff -r a8a31a87d992 -r 08bbf805fc4b usr.bin/ftp/progressbar.h
--- a/usr.bin/ftp/progressbar.h Tue Jan 05 23:50:29 2021 +0000
+++ b/usr.bin/ftp/progressbar.h Wed Jan 06 04:43:14 2021 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: progressbar.h,v 1.8 2009/04/12 10:18:52 lukem Exp $    */
+/*     $NetBSD: progressbar.h,v 1.9 2021/01/06 04:43:14 lukem Exp $    */
 
 /*-
- * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996-2021 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -68,7 +68,6 @@
 void   alarmtimer(int);
 void   progressmeter(int);
 sigfunc        xsignal(int, sigfunc);
-sigfunc        xsignal_restart(int, sigfunc, int);
 
 #ifndef STANDALONE_PROGRESS
 void   psummary(int);
diff -r a8a31a87d992 -r 08bbf805fc4b usr.bin/ftp/ssl.c
--- a/usr.bin/ftp/ssl.c Tue Jan 05 23:50:29 2021 +0000
+++ b/usr.bin/ftp/ssl.c Wed Jan 06 04:43:14 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ssl.c,v 1.8 2019/04/07 00:44:54 christos Exp $ */
+/*     $NetBSD: ssl.c,v 1.9 2021/01/06 04:43:14 lukem Exp $    */
 
 /*-
  * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
@@ -34,7 +34,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ssl.c,v 1.8 2019/04/07 00:44:54 christos Exp $");
+__RCSID("$NetBSD: ssl.c,v 1.9 2021/01/06 04:43:14 lukem Exp $");
 #endif
 
 #include <time.h>
@@ -356,6 +356,10 @@
                if (quit_time > 0) {
                        gettimeofday(&now, NULL);
                        if (!timercmp(timeout, &now, >)) {
+                               fprintf(ttyout, "\r\n%s: transfer aborted"
+                                   " because stalled for %lu sec.\r\n",
+                                   getprogname(), (unsigned long)quit_time);
+                               errno = ETIMEDOUT;
                                conn->iserr = ETIMEDOUT;
                                return -1;
                        }
diff -r a8a31a87d992 -r 08bbf805fc4b usr.bin/ftp/version.h
--- a/usr.bin/ftp/version.h     Tue Jan 05 23:50:29 2021 +0000
+++ b/usr.bin/ftp/version.h     Wed Jan 06 04:43:14 2021 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: version.h,v 1.91 2020/07/18 03:00:37 lukem Exp $       */
+/*     $NetBSD: version.h,v 1.92 2021/01/06 04:43:14 lukem Exp $       */
 
 /*-
- * Copyright (c) 1999-2020 The NetBSD Foundation, Inc.
+ * Copyright (c) 1999-2021 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -34,5 +34,5 @@
 #endif
 
 #ifndef FTP_VERSION
-#define        FTP_VERSION     "20200718"
+#define        FTP_VERSION     "20210106"
 #endif



Home | Main Index | Thread Index | Old Index