wget: make -T timeout work on header reads too. Closes 8636
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 17 Mar 2016 14:58:16 +0000 (15:58 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 17 Mar 2016 20:52:42 +0000 (21:52 +0100)
function                                             old     new   delta
set_alarm                                              -      27     +27
fgets_and_trim                                        76      92     +16
wget_main                                           2610    2616      +6
open_socket                                           64      54     -10

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/wget.c

index 7f27e4e7b8aa0e8bc56ebbd5e30cbc5caf07c64a..5c12423c7d50a776a1b1e66821ce7e36801e204a 100644 (file)
@@ -203,7 +203,7 @@ struct globals {
        const char *user_agent; /* "User-Agent" header field */
 #if ENABLE_FEATURE_WGET_TIMEOUT
        unsigned timeout_seconds;
-       bool connecting;
+       bool die_if_timed_out;
 #endif
        int output_fd;
        int o_flags;
@@ -333,9 +333,20 @@ static char* sanitize_string(char *s)
 static void alarm_handler(int sig UNUSED_PARAM)
 {
        /* This is theoretically unsafe (uses stdio and malloc in signal handler) */
-       if (G.connecting)
+       if (G.die_if_timed_out)
                bb_error_msg_and_die("download timed out");
 }
+static void set_alarm(void)
+{
+       if (G.timeout_seconds) {
+               alarm(G.timeout_seconds);
+               G.die_if_timed_out = 1;
+       }
+}
+# define clear_alarm() ((void)(G.die_if_timed_out = 0))
+#else
+# define set_alarm()   ((void)0)
+# define clear_alarm() ((void)0)
 #endif
 
 static FILE *open_socket(len_and_sockaddr *lsa)
@@ -343,9 +354,9 @@ static FILE *open_socket(len_and_sockaddr *lsa)
        int fd;
        FILE *fp;
 
-       IF_FEATURE_WGET_TIMEOUT(alarm(G.timeout_seconds); G.connecting = 1;)
+       set_alarm();
        fd = xconnect_stream(lsa);
-       IF_FEATURE_WGET_TIMEOUT(G.connecting = 0;)
+       clear_alarm();
 
        /* glibc 2.4 seems to try seeking on it - ??! */
        /* hopefully it understands what ESPIPE means... */
@@ -357,14 +368,15 @@ static FILE *open_socket(len_and_sockaddr *lsa)
 }
 
 /* Returns '\n' if it was seen, else '\0'. Trims at first '\r' or '\n' */
-/* FIXME: does not respect FEATURE_WGET_TIMEOUT and -T N: */
 static char fgets_and_trim(FILE *fp)
 {
        char c;
        char *buf_ptr;
 
+       set_alarm();
        if (fgets(G.wget_buf, sizeof(G.wget_buf) - 1, fp) == NULL)
                bb_perror_msg_and_die("error getting response");
+       clear_alarm();
 
        buf_ptr = strchrnul(G.wget_buf, '\n');
        c = *buf_ptr;