In bug 247, haveaniceday writes:
authorMike Frysinger <vapier@gentoo.org>
Fri, 6 May 2005 04:45:38 +0000 (04:45 -0000)
committerMike Frysinger <vapier@gentoo.org>
Fri, 6 May 2005 04:45:38 +0000 (04:45 -0000)
The option "-w secs" adds a timeout for writing.

include/usage.h
networking/nc.c

index b57644b..d731957 100644 (file)
        "\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" \
index 3099763..bbcbc0d 100644 (file)
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <signal.h>
 
 #include <sys/types.h>
 #include <sys/socket.h>
 
 #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) {