From 60a5c38a4b7e223dda52baf943b8edac7eeccb59 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 6 May 2005 04:45:38 +0000 Subject: In bug 247, haveaniceday writes: The option "-w secs" adds a timeout for writing. --- include/usage.h | 1 + networking/nc.c | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/include/usage.h b/include/usage.h index b57644bc1..d731957f1 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 3099763b1..bbcbc0d13 100644 --- a/networking/nc.c +++ b/networking/nc.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -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) { -- cgit v1.2.3