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. --- networking/nc.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'networking') 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