Re: [PATCH 2/2] wget: add support for connect timeout

2013-10-12 Thread Denys Vlasenko
On Tuesday 08 October 2013 16:17, Lauri Kasanen wrote:
> Hi,
> 
> Connect timeout support for wget.

Applied with small changes. Thanks!

Note that read timeout is still not implemented in fgets_and_trim(),
which is used to read ftp responses and http headers...

-- 
vda

___
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[PATCH 2/2] wget: add support for connect timeout

2013-10-08 Thread Lauri Kasanen
Hi,

Connect timeout support for wget.

Bloatcheck:

function old new   delta
open_socket   38  71 +33
alarm_handler  -  31 +31
wget_main   24322447 +15
ftpcmd   127 130  +3
fgets_and_trim89  92  +3
base64enc 63  66  +3
--
(add/remove: 1/0 grow/shrink: 5/0 up/down: 88/0)   Total: 88
bytes
   textdata bss dec hex filename
  21739 970 104   22813591d busybox_old
  21980 986 104   230705a1e busybox_unstripped


- Lauri

-- 
http://www.fastmail.fm - Or how I learned to stop worrying and
  love email again

From 2a33129f02ce0609ba88e3d4ae98b1bed60654f0 Mon Sep 17 00:00:00 2001
From: Lauri Kasanen 
Date: Tue, 8 Oct 2013 17:11:22 +0300
Subject: [PATCH 2/2] wget: add support for connect timeout

Signed-off-by: Lauri Kasanen 
---
 networking/Config.src | 16 +---
 networking/wget.c | 18 +-
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/networking/Config.src b/networking/Config.src
index 0a483ae..987ae26 100644
--- a/networking/Config.src
+++ b/networking/Config.src
@@ -970,16 +970,18 @@ config FEATURE_WGET_LONG_OPTIONS
 	  Support long options for the wget applet.
 
 config FEATURE_WGET_TIMEOUT
-	bool "Enable read timeout option -T SEC"
+	bool "Enable timeout option -T SEC"
 	default y
 	depends on WGET
 	help
-	  Supports network read timeout for wget, so that wget will give
-	  up and timeout when reading network data, through the -T command
-	  line option.  Currently only network data read timeout is
-	  supported (i.e., timeout is not applied to the DNS nor TCP
-	  connection initialization).  When FEATURE_WGET_LONG_OPTIONS is
-	  also enabled, the --timeout option will work in addition to -T.
+	  Supports network read and connect timeouts for wget,
+	  so that wget will give up and timeout, through the -T
+	  command line option.
+
+	  Currently only connect and network data read timeout are
+	  supported (i.e., timeout is not applied to the DNS query). When 
+	  FEATURE_WGET_LONG_OPTIONS is also enabled, the --timeout option
+	  will work in addition to -T.
 
 config WGET_DEFAULT_TIMEOUT
 	int "Default wget timeout"
diff --git a/networking/wget.c b/networking/wget.c
index f604828..5e3533a 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -72,6 +72,7 @@ struct globals {
 	const char *user_agent; /* "User-Agent" header field */
 #if ENABLE_FEATURE_WGET_TIMEOUT
 	unsigned timeout_seconds;
+	bool connecting;
 #endif
 	int output_fd;
 	int o_flags;
@@ -198,12 +199,16 @@ static FILE *open_socket(len_and_sockaddr *lsa)
 {
 	FILE *fp;
 
+	IF_FEATURE_WGET_TIMEOUT(G.connecting = 1; alarm(G.timeout_seconds);)
+
 	/* glibc 2.4 seems to try seeking on it - ??! */
 	/* hopefully it understands what ESPIPE means... */
 	fp = fdopen(xconnect_stream(lsa), "r+");
 	if (fp == NULL)
 		bb_perror_msg_and_die(bb_msg_memory_exhausted);
 
+	IF_FEATURE_WGET_TIMEOUT(G.connecting = 0;)
+
 	return fp;
 }
 
@@ -907,6 +912,14 @@ However, in real world it was observed that some web servers
 	free(redirected_path);
 }
 
+#if ENABLE_FEATURE_WGET_TIMEOUT
+static void alarm_handler(int sig UNUSED_PARAM)
+{
+	if (G.connecting)
+		bb_error_msg_and_die("download timed out");
+}
+#endif
+
 int wget_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int wget_main(int argc UNUSED_PARAM, char **argv)
 {
@@ -943,7 +956,10 @@ int wget_main(int argc UNUSED_PARAM, char **argv)
 
 	INIT_G();
 
-	IF_FEATURE_WGET_TIMEOUT(G.timeout_seconds = CONFIG_WGET_DEFAULT_TIMEOUT;)
+#if ENABLE_FEATURE_WGET_TIMEOUT
+	G.timeout_seconds = CONFIG_WGET_DEFAULT_TIMEOUT;
+	signal(SIGALRM, alarm_handler);
+#endif
 	G.proxy_flag = "on";   /* use proxies if env vars are set */
 	G.user_agent = "Wget"; /* "User-Agent" header field */
 
-- 
1.8.3.1

___
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox