On Tue, Aug 19, 2008 at 10:58:39AM +0200, Matthias Kaehlcke wrote:
>wget: Add support for timeout parameter
>
>Signed-off-by: Matthias Kaehlcke <[EMAIL PROTECTED]>
>
>---
>
>--- busybox-1.11.1.org/networking/wget.c       2008-06-25 14:51:14.000000000 
>+0200
>+++ busybox-1.11.1/networking/wget.c   2008-08-19 10:41:38.000000000 +0200
>@@ -29,9 +29,11 @@
>       off_t transferred;        /* Number of bytes transferred so far */
>       const char *curfile;      /* Name of current file being transferred */
>       unsigned lastupdate_sec;
>-      unsigned start_sec;
> #endif
>+      unsigned start_sec;
>       smallint chunked;             /* chunked transfer encoding */
>+      unsigned timeout;         /* Operation timeout */
>+      smallint quiet;

perhaps unify quiet and chunked into one "flags" for size-benefit.

> };
> #define G (*(struct globals*)&bb_common_bufsiz1)
> struct BUG_G_too_big {
>@@ -46,6 +48,8 @@
> #define lastupdate_sec  (G.lastupdate_sec )
> #define start_sec       (G.start_sec      )
> #define chunked         (G.chunked        )
>+#define timeout         (G.timeout        )
>+#define quiet           (G.quiet          )
> #define INIT_G() do { } while (0)
> 
> 
>@@ -63,15 +67,12 @@
> 
> static void progressmeter(int flag)
> {
>-      /* We can be called from signal handler */
>-      int save_errno = errno;
>       off_t abbrevsize;
>       unsigned since_last_update, elapsed;
>       unsigned ratio;
>       int barlength, i;
> 
>-      if (flag == -1) { /* first call to progressmeter */
>-              start_sec = monotonic_sec();
>+      if (flag == -1) { /* first call to progressmeter */             

superfluous whitespace at EOL.

>               lastupdate_sec = start_sec;
>               lastsize = 0;
>               totalsize = content_len + beg_range; /* as content_len 
> changes.. */
>@@ -139,18 +140,12 @@
> 
>       if (flag == 0) {
>               /* last call to progressmeter */
>-              alarm(0);
>               transferred = 0;
>               fputc('\n', stderr);
>-      } else {
>-              if (flag == -1) { /* first call to progressmeter */
>-                      signal_SA_RESTART_empty_mask(SIGALRM, progressmeter);
>-              }
>-              alarm(1);
>-      }
>-
>-      errno = save_errno;
>+      }       
> }
>+
>+
> /* Original copyright notice which applies to the 
> CONFIG_FEATURE_WGET_STATUSBAR stuff,
>  * much of which was blatantly stolen from openssh.  */
> /*-
>@@ -193,6 +188,29 @@
> #endif
> 
> 
>+/* Perform periodic tasks during a download */   

superfluous whitespace at EOL.

>+static void timer(int flag ATTRIBUTE_UNUSED)
>+{
>+      /* we are called from a signal handler */
>+      int save_errno = errno;
>+
>+      if (timeout != 0) {
>+              if ((start_sec + timeout) < monotonic_sec()) {
>+                      bb_perror_msg_and_die("download timed out");
>+              }
>+      }
>+      

superfluous whitespace.

>+      if (!quiet) {
>+              progressmeter(1);
>+      }
>+      

ditto.

>+      /* re-trigger timer */
>+      alarm(1);
>+              

likewise.

>+      errno = save_errno;
>+}
>+
>+
> /* Read NMEMB bytes into PTR from STREAM.  Returns the number of bytes read,
>  * and a short count if an eof or non-interrupt error is encountered.  */
> static size_t safe_fread(void *ptr, size_t nmemb, FILE *stream)
>@@ -410,6 +428,7 @@
>       bool use_proxy = 1;             /* Use proxies if env vars are set  */
>       const char *proxy_flag = "on";  /* Use proxies if env vars are set  */
>       const char *user_agent = "Wget";/* "User-Agent" header field        */
>+      const char *timeout_param = "0";/* Operation timeout parameter      */
> 
>       static const char keywords[] ALIGN1 =
>               "content-length\0""transfer-encoding\0""chunked\0""location\0";
>@@ -426,6 +445,7 @@
>               WGET_OPT_USER_AGENT = 0x40,
>               WGET_OPT_PASSIVE    = 0x80,
>               WGET_OPT_HEADER     = 0x100,
>+              WGET_OPT_TIMEOUT    = 0x200,
>       };
> #if ENABLE_FEATURE_WGET_LONG_OPTIONS
>       static const char wget_longopts[] ALIGN1 =
>@@ -437,6 +457,7 @@
>               "directory-prefix\0" Required_argument "P"
>               "proxy\0"            Required_argument "Y"
>               "user-agent\0"       Required_argument "U"
>+              "timeout\0"          Required_argument "T"
>               "passive-ftp\0"      No_argument       "\xff"
>               "header\0"           Required_argument "\xfe"
>               ;
>@@ -449,15 +470,19 @@
> #endif
>       /* server.allocated = target.allocated = NULL; */
>       opt_complementary = "-1" USE_FEATURE_WGET_LONG_OPTIONS(":\xfe::");
>-      opt = getopt32(argv, "csqO:P:Y:U:",
>+      opt = getopt32(argv, "csqO:P:Y:U:T:",
>                               &fname_out, &dir_prefix,
>-                              &proxy_flag, &user_agent
>+                              &proxy_flag, &user_agent,
>+                              &timeout_param
>                               USE_FEATURE_WGET_LONG_OPTIONS(, &headers_llist)
>                               );
>       if (strcmp(proxy_flag, "off") == 0) {
>               /* Use the proxy if necessary */
>               use_proxy = 0;
>       }
>+
>+      timeout = atoi(timeout_param);
>+      

same here.
atoi() is discouraged, use one of the existing number converters that do
input validation and range-checking (see xatonum.c and other users).

> #if ENABLE_FEATURE_WGET_LONG_OPTIONS
>       if (headers_llist) {
>               int size = 1;
>@@ -504,10 +529,18 @@
>                       opt &= ~WGET_OPT_CONTINUE;
>               }
>       }
>+

unrelated edit...

> #if ENABLE_FEATURE_WGET_STATUSBAR
>       curfile = bb_get_last_path_component_nostrip(fname_out);
> #endif
> 
>+      if (opt & WGET_OPT_QUIET) {
>+              quiet = 1;
>+      }
>+      else {
>+              quiet = 0;
>+      }

quiet = opt & WGET_OPT_QUIET; smaller?

>+
>       /* Impossible?
>       if ((opt & WGET_OPT_CONTINUE) && !fname_out)
>               bb_error_msg_and_die("cannot specify continue (-c) without a 
> filename (-O)"); */
>@@ -772,9 +805,17 @@
>               output_fd = xopen(fname_out, o_flags);
>       }
> 
>-      if (!(opt & WGET_OPT_QUIET))
>+      start_sec = monotonic_sec();
>+
>+      if (!(opt & WGET_OPT_QUIET)) {

Why don't you use quiet here and below?

>+              /* first call to progressmeter */
>               progressmeter(-1);
>+      }
> 
>+      /* setup the timer */
>+      signal_SA_RESTART_empty_mask(SIGALRM, timer);   
>+      alarm(1);
>+      
>       if (chunked)
>               goto get_clen;
> 
>@@ -814,8 +855,13 @@
>                       break; /* all done! */
>       }
> 
>-      if (!(opt & WGET_OPT_QUIET))
>+      /* stop timer */
>+      alarm(0);
>+
>+      if (!(opt & WGET_OPT_QUIET)) {
>+              /* last call to progressmeter */
>               progressmeter(0);
>+      }       
> 
>       if ((use_proxy == 0) && target.is_ftp) {
>               fclose(dfp);
>--- busybox-1.11.1.org/include/usage.h 2008-07-11 22:22:20.000000000 +0200
>+++ busybox-1.11.1/include/usage.h     2008-08-19 10:37:24.000000000 +0200
>@@ -4514,10 +4514,10 @@
>       USE_GETOPT_LONG( \
>        "[-c|--continue] [-s|--spider] [-q|--quiet] [-O|--output-document 
> file]\n" \
>        "      [--header 'header: value'] [-Y|--proxy on/off] [-P DIR]\n" \
>-       "      [-U|--user-agent agent] url" \
>+       "      [-U|--user-agent agent] url [-T|--timeout SECONDS]" \
>       ) \
>       SKIP_GETOPT_LONG( \
>-       "[-csq] [-O file] [-Y on/off] [-P DIR] [-U agent] url" \
>+       "[-csq] [-O file] [-Y on/off] [-P DIR] [-U agent] url [-T SECONDS]" \
>       )
> #define wget_full_usage "\n\n" \
>        "Retrieve files via HTTP or FTP\n" \
>@@ -4529,6 +4529,7 @@
>      "\n      -O      Save to filename ('-' for stdout)" \
>      "\n      -U      Adjust 'User-Agent' field" \
>      "\n      -Y      Use proxy ('on' or 'off')" \
>+     "\n      -T      Set timeout value to SECONDS" \

      "\n       -T      timeout in SECONDS" \
should be clear enough (and is shorter).

Care to resend?

PS: a size(1) would have been nice
TIA,
Bernhard
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to