diff options
author | Mike Frysinger | 2005-05-06 04:45:38 +0000 |
---|---|---|
committer | Mike Frysinger | 2005-05-06 04:45:38 +0000 |
commit | 60a5c38a4b7e223dda52baf943b8edac7eeccb59 (patch) | |
tree | dbb31dab0efc295d0c4839f8f7e7d51aa6684908 | |
parent | 4f65360a5f36e1841b13dc50108c290010347e7f (diff) | |
download | busybox-60a5c38a4b7e223dda52baf943b8edac7eeccb59.zip busybox-60a5c38a4b7e223dda52baf943b8edac7eeccb59.tar.gz |
In bug 247, haveaniceday writes:
The option "-w secs" adds a timeout for writing.
-rw-r--r-- | include/usage.h | 1 | ||||
-rw-r--r-- | networking/nc.c | 23 |
2 files changed, 22 insertions, 2 deletions
diff --git a/include/usage.h b/include/usage.h index b57644b..d731957 100644 --- a/include/usage.h +++ b/include/usage.h @@ -1832,6 +1832,7 @@ "\t-l\t\tlisten mode, for inbound connects\n" \ "\t-p PORT\t\tlocal port number\n" \ "\t-i SECS\t\tdelay interval for lines sent\n" \ + "\t-w SECS\t\ttimeout for connects and final net reads\n" \ "\t-e PROG\t\tprogram to exec after connect (dangerous!)" #define nc_example_usage \ "$ nc foobar.somedomain.com 25\n" \ diff --git a/networking/nc.c b/networking/nc.c index 3099763..bbcbc0d 100644 --- a/networking/nc.c +++ b/networking/nc.c @@ -30,6 +30,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <signal.h> #include <sys/types.h> #include <sys/socket.h> @@ -42,9 +43,14 @@ #define GAPING_SECURITY_HOLE +static void timeout(int signum) +{ + bb_error_msg_and_die("Timed out"); +} + int nc_main(int argc, char **argv) { - int do_listen = 0, lport = 0, delay = 0, tmpfd, opt, sfd, x; + int do_listen = 0, lport = 0, delay = 0, wsecs = 0, tmpfd, opt, sfd, x; char buf[BUFSIZ]; #ifdef GAPING_SECURITY_HOLE char * pr00gie = NULL; @@ -55,7 +61,7 @@ int nc_main(int argc, char **argv) fd_set readfds, testfds; - while ((opt = getopt(argc, argv, "lp:i:e:")) > 0) { + while ((opt = getopt(argc, argv, "lp:i:e:w:")) > 0) { switch (opt) { case 'l': do_listen++; @@ -71,6 +77,9 @@ int nc_main(int argc, char **argv) pr00gie = optarg; break; #endif + case 'w': + wsecs = atoi(optarg); + break; default: bb_show_usage(); } @@ -94,6 +103,11 @@ int nc_main(int argc, char **argv) bb_perror_msg_and_die ("reuseaddr failed"); address.sin_family = AF_INET; + if (wsecs) { + signal(SIGALRM, timeout); + alarm(wsecs); + } + if (lport != 0) { memset(&address.sin_addr, 0, sizeof(address.sin_addr)); address.sin_port = lport; @@ -123,6 +137,11 @@ int nc_main(int argc, char **argv) bb_perror_msg_and_die("connect"); } + if (wsecs) { + alarm(0); + signal(SIGALRM, SIG_DFL); + } + #ifdef GAPING_SECURITY_HOLE /* -e given? */ if (pr00gie) { |