diff options
| author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2026-06-29 15:53:53 +0000 |
|---|---|---|
| committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2026-06-29 15:53:53 +0000 |
| commit | 1b5f832e268f1f1092d0ebfc3bab4a7228aae20b (patch) | |
| tree | 2c661f7f4fdcd4dffbc837d536ac7cf5a4278908 | |
| parent | d40b35f8eb1dbab430d595193ddb1c950766bcac (diff) | |
Revert "fetch: Stop setting an alarm"
This reverts commit 23380f3e6ac9334e85489f92f7f20b700ede3368.
| -rw-r--r-- | usr.bin/fetch/fetch.1 | 10 | ||||
| -rw-r--r-- | usr.bin/fetch/fetch.c | 33 |
2 files changed, 28 insertions, 15 deletions
diff --git a/usr.bin/fetch/fetch.1 b/usr.bin/fetch/fetch.1 index 17b96d8d459b..7238226998fc 100644 --- a/usr.bin/fetch/fetch.1 +++ b/usr.bin/fetch/fetch.1 @@ -28,7 +28,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd June 27, 2026 +.Dd October 7, 2023 .Dt FETCH 1 .Os .Sh NAME @@ -283,7 +283,7 @@ ignored and the file is fetched unconditionally. .It Fl s , -print-size Print the size in bytes of each requested file, without fetching it. .It Fl T Ar seconds , Fl -timeout= Ns Ar seconds -Set the network timeout to +Set timeout value to .Ar seconds . Overrides the environment variables .Ev FTP_TIMEOUT @@ -322,11 +322,9 @@ message. .Sh ENVIRONMENT .Bl -tag -width HTTP_TIMEOUT .It Ev FTP_TIMEOUT -Maximum time, in seconds, to wait before giving up on a stalled FTP -transfer. +Maximum time, in seconds, to wait before aborting an FTP connection. .It Ev HTTP_TIMEOUT -Maximum time, in seconds, to wait before giving up on a stalled HTTP -transfer. +Maximum time, in seconds, to wait before aborting an HTTP connection. .El .Pp See diff --git a/usr.bin/fetch/fetch.c b/usr.bin/fetch/fetch.c index 4e2a7596e796..5e4b14289ca7 100644 --- a/usr.bin/fetch/fetch.c +++ b/usr.bin/fetch/fetch.c @@ -87,6 +87,7 @@ static pid_t pgrp; /* our process group */ static long w_secs; /* -w: retry delay */ static int family = PF_UNSPEC; /* -[46]: address family to use */ +static int sigalrm; /* SIGALRM received */ static int siginfo; /* SIGINFO received */ static int sigint; /* SIGINT received */ @@ -172,6 +173,9 @@ static void sig_handler(int sig) { switch (sig) { + case SIGALRM: + sigalrm = 1; + break; case SIGINFO: siginfo = 1; break; @@ -432,7 +436,6 @@ fetch(char *URL, const char *path, int *is_http) char *tmppath; int r, tries; unsigned timeout; - int timedout = 0; char *ptr; f = of = NULL; @@ -516,7 +519,13 @@ fetch(char *URL, const char *path, int *is_http) /* just print size */ if (s_flag) { + if (timeout) + alarm(timeout); r = fetchStat(url, &us, flags); + if (timeout) + alarm(0); + if (sigalrm || sigint) + goto signal; if (r == -1) { warnx("%s", fetchLastErrString); goto failure; @@ -565,7 +574,13 @@ again: size_prev = sb.st_size; /* start the transfer */ + if (timeout) + alarm(timeout); f = fetchXGet(url, &us, flags); + if (timeout) + alarm(0); + if (sigalrm || sigint) + goto signal; if (f == NULL) { if (i_flag && *is_http && fetchLastErrCode == FETCH_OK && strcmp(fetchLastErrString, "Not Modified") == 0) { @@ -733,7 +748,7 @@ again: /* start the counter */ stat_start(&xs, path, us.size, count); - siginfo = sigint = 0; + sigalrm = siginfo = sigint = 0; /* suck in the data */ setvbuf(f, NULL, _IOFBF, B_size); @@ -770,7 +785,8 @@ again: if (readcnt != 0) break; } - timedout = ferror(f) && errno == ETIMEDOUT; + if (!sigalrm) + sigalrm = ferror(f) && errno == ETIMEDOUT; signal(SIGINFO, SIG_DFL); stat_end(&xs); @@ -795,20 +811,18 @@ again: } /* timed out or interrupted? */ - if (timedout) { + if (sigalrm) warnx("transfer timed out"); - goto failure; - } if (sigint) { warnx("transfer interrupted"); goto failure; } - /* timeout / interrupt before connection completely established? */ + /* timeout / interrupt before connection completley established? */ if (f == NULL) goto failure; - if (!timedout) { + if (!sigalrm) { /* check the status of our files */ if (ferror(f)) warn("%s", URL); @@ -836,7 +850,7 @@ again: * If the transfer timed out and we didn't know how much to * expect, assume the worst (i.e. we didn't get all of it) */ - if (timedout && us.size == -1) { + if (sigalrm && us.size == -1) { warnx("%s may be truncated", path); goto failure_keep; } @@ -1112,6 +1126,7 @@ main(int argc, char *argv[]) sa.sa_flags = 0; sa.sa_handler = sig_handler; sigemptyset(&sa.sa_mask); + sigaction(SIGALRM, &sa, NULL); sa.sa_flags = SA_RESETHAND; sigaction(SIGINT, &sa, NULL); fetchRestartCalls = 0; |
