telnetd -b (bind to specific address) support from Iuri Gomes Diniz.
authorRob Landley <rob@landley.net>
Thu, 10 Nov 2005 22:37:40 +0000 (22:37 -0000)
committerRob Landley <rob@landley.net>
Thu, 10 Nov 2005 22:37:40 +0000 (22:37 -0000)
include/usage.h
networking/telnetd.c

index a82230e..4b27984 100644 (file)
        "Telnetd listens for incoming TELNET connections on PORT.\n" \
        "Options:\n" \
        "\t-p PORT\tlisten for connections on PORT (default 23)\n" \
+       "\t-b ADDR\tlisten for connections on ADDR (default 0.0.0.0)\n"\
        "\t-l LOGIN\texec LOGIN on connect (default /bin/sh)\n" \
        "\t-f issue_file\tDisplay issue_file instead of /etc/issue"
 #endif
index b3d0a11..d5de890 100644 (file)
@@ -33,6 +33,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <signal.h>
@@ -390,13 +391,14 @@ telnetd_main(int argc, char **argv)
 #ifndef CONFIG_FEATURE_TELNETD_INETD
        int on = 1;
        int portnbr = 23;
+       struct in_addr bind_addr = { .s_addr = 0x0 };
 #endif /* CONFIG_FEATURE_TELNETD_INETD */
        int c;
        static const char options[] =
 #ifdef CONFIG_FEATURE_TELNETD_INETD
                "f:l:";
 #else /* CONFIG_EATURE_TELNETD_INETD */
-               "f:l:p:";
+               "f:l:p:b:";
 #endif /* CONFIG_FEATURE_TELNETD_INETD */
        int maxlen, w, r;
 
@@ -418,6 +420,10 @@ telnetd_main(int argc, char **argv)
                        case 'p':
                                portnbr = atoi(optarg);
                                break;
+                       case 'b':
+                               if (inet_aton(optarg, &bind_addr) == 0)
+                                       bb_show_usage();
+                               break;
 #endif /* CONFIG_FEATURE_TELNETD_INETD */
                        default:
                                bb_show_usage();
@@ -452,9 +458,11 @@ telnetd_main(int argc, char **argv)
 #ifdef CONFIG_FEATURE_IPV6
        sa.sin6_family = AF_INET6;
        sa.sin6_port = htons(portnbr);
+       /* sa.sin6_addr = bind_addr6; */
 #else
        sa.sin_family = AF_INET;
        sa.sin_port = htons(portnbr);
+       sa.sin_addr = bind_addr;
 #endif
 
        if (bind(master_fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {