Ticket #528: busybox.patch

File busybox.patch, 7.5 KB (added by mwigge@…, 12 years ago)

Adds "ping -I" and "telnet -b"

  • package/busybox/patches/350-ping-opt-srcaddr.patch

    diff --exclude .svn -Nur ../openwrt/package/busybox/patches/350-ping-opt-srcaddr.patch package/busybox/patches/350-ping-opt-srcaddr.patch
    old new  
     1diff -urN busybox-1.00.orig/include/usage.h busybox-1.00/include/usage.h 
     2--- busybox-1.00.orig/include/usage.h   2006-06-27 12:44:26.000000000 +0200 
     3+++ busybox-1.00/include/usage.h        2006-06-27 13:21:57.000000000 +0200 
     4@@ -1894,6 +1894,7 @@ 
     5        "Options:\n" \ 
     6        "\t-c COUNT\tSend only COUNT pings.\n" \ 
     7        "\t-s SIZE\t\tSend SIZE data bytes in packets (default=56).\n" \ 
     8+       "\t-I IPADDR\tUse IPADDR as source address.\n" \ 
     9        "\t-q\t\tQuiet mode, only displays output at start\n" \ 
     10        "\t\t\tand when finished." 
     11 #endif 
     12diff -urN busybox-1.00.orig/networking/ping.c busybox-1.00/networking/ping.c 
     13--- busybox-1.00.orig/networking/ping.c 2006-06-27 12:44:26.000000000 +0200 
     14+++ busybox-1.00/networking/ping.c      2006-06-27 13:19:04.000000000 +0200 
     15@@ -170,6 +170,7 @@ 
     16 #else /* ! CONFIG_FEATURE_FANCY_PING */ 
     17 /* full(er) version */ 
     18 static struct sockaddr_in pingaddr; 
     19+static struct sockaddr_in sourceaddr; 
     20 static int pingsock = -1; 
     21 static int datalen; /* intentionally uninitialized to work around gcc bug */ 
     22  
     23@@ -342,6 +343,11 @@ 
     24  
     25        pingsock = create_icmp_socket(); 
     26  
     27+       if (sourceaddr.sin_addr.s_addr != 0) { 
     28+               if (bind(pingsock, (struct sockaddr*)&sourceaddr, sizeof(sourceaddr)) == -1) 
     29+                       bb_error_msg_and_die("could not bind to address"); 
     30+       } 
     31+ 
     32        memset(&pingaddr, 0, sizeof(struct sockaddr_in)); 
     33  
     34        pingaddr.sin_family = AF_INET; 
     35@@ -361,10 +367,14 @@ 
     36        setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt, 
     37                           sizeof(sockopt)); 
     38  
     39-       printf("PING %s (%s): %d data bytes\n", 
     40+       printf("PING %s (%s)", 
     41                   hostent->h_name, 
     42-                  inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr), 
     43-                  datalen); 
     44+                  inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr)); 
     45+       if (sourceaddr.sin_addr.s_addr != 0) { 
     46+               printf(" from %s", 
     47+                          inet_ntoa(*(struct in_addr *) &sourceaddr.sin_addr.s_addr)); 
     48+       } 
     49+       printf(": %d data bytes\n", datalen); 
     50  
     51        signal(SIGINT, pingstats); 
     52  
     53@@ -400,6 +410,7 @@ 
     54        argc--; 
     55        argv++; 
     56        options = 0; 
     57+       memset(&sourceaddr, 0, sizeof(sourceaddr)); 
     58        /* Parse any options */ 
     59        while (argc >= 1 && **argv == '-') { 
     60                thisarg = *argv; 
     61@@ -420,6 +431,27 @@ 
     62                        argv++; 
     63                        datalen = atoi(*argv); 
     64                        break; 
     65+               case 'I': 
     66+                       if (--argc <= 0) 
     67+                               bb_show_usage(); 
     68+                       argv++; 
     69+                       { 
     70+                               char dummy; 
     71+                               int i1, i2, i3, i4; 
     72+                               if (sscanf(*argv, "%u.%u.%u.%u%c", 
     73+                                                  &i1, &i2, &i3, &i4, &dummy) == 4) { 
     74+                                       unsigned char* ptr; 
     75+                                       ptr = (unsigned char*)&sourceaddr.sin_addr; 
     76+                                       ptr[0] = i1; 
     77+                                       ptr[1] = i2; 
     78+                                       ptr[2] = i3; 
     79+                                       ptr[3] = i4; 
     80+                               } 
     81+                               else { 
     82+                                       bb_show_usage(); 
     83+                               } 
     84+                       } 
     85+                       break; 
     86                default: 
     87                        bb_show_usage(); 
     88                } 
  • package/busybox/patches/351-telnet-opt-srcaddr.patch

    diff --exclude .svn -Nur ../openwrt/package/busybox/patches/351-telnet-opt-srcaddr.patch package/busybox/patches/351-telnet-opt-srcaddr.patch
    old new  
     1diff -urN busybox-1.00.orig/include/usage.h busybox-1.00/include/usage.h 
     2--- busybox-1.00.orig/include/usage.h   2006-06-27 13:34:21.000000000 +0200 
     3+++ busybox-1.00/include/usage.h        2006-06-27 13:56:08.000000000 +0200 
     4@@ -2445,23 +2445,30 @@ 
     5  
     6 #ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN 
     7 #define telnet_trivial_usage \ 
     8-       "[-a] [-l USER] HOST [PORT]" 
     9+       "[-a] [-l USER] [-b SRCADDR] HOST [PORT]" 
     10 #define telnet_full_usage \ 
     11        "Telnet is used to establish interactive communication with another\n" \ 
     12        "computer over a network using the TELNET protocol.\n\n" \ 
     13        "Options:\n" \ 
     14        "\t-a\t\tAttempt an automatic login with the USER variable.\n" \ 
     15        "\t-l USER\t\tAttempt an automatic login with the USER argument.\n" \ 
     16+       "\t-b SRCADDR\tUse SRCADDR as local source address.\n" \ 
     17        "\tHOST\t\tThe official name, alias or the IP address of the\n" \ 
     18        "\t\t\tremote host.\n" \ 
     19        "\tPORT\t\tThe remote port number to connect to. If it is not\n" \ 
     20        "\t\t\tspecified, the default telnet (23) port is used." 
     21 #else 
     22 #define telnet_trivial_usage \ 
     23-       "HOST [PORT]" 
     24+       "[-b SRCADDR] HOST [PORT]" 
     25 #define telnet_full_usage \ 
     26        "Telnet is used to establish interactive communication with another\n"\ 
     27-       "computer over a network using the TELNET protocol." 
     28+       "computer over a network using the TELNET protocol.\n\n" \ 
     29+       "Options:\n" \ 
     30+       "\t-b SRCADDR\tUse SRCADDR as local source address.\n" \ 
     31+       "\tHOST\t\tThe official name, alias or the IP address of the\n" \ 
     32+       "\t\t\tremote host.\n" \ 
     33+       "\tPORT\t\tThe remote port number to connect to. If it is not\n" \ 
     34+       "\t\t\tspecified, the default telnet (23) port is used." 
     35 #endif 
     36  
     37 #ifdef CONFIG_FEATURE_TELNETD_INETD 
     38diff -urN busybox-1.00.orig/networking/telnet.c busybox-1.00/networking/telnet.c 
     39--- busybox-1.00.orig/networking/telnet.c       2004-09-14 19:24:58.000000000 +0200 
     40+++ busybox-1.00/networking/telnet.c    2006-06-27 13:50:52.000000000 +0200 
     41@@ -44,6 +44,7 @@ 
     42 #include <sys/types.h> 
     43 #include <sys/socket.h> 
     44 #include <netinet/in.h> 
     45+#include <arpa/inet.h> 
     46 #include "busybox.h" 
     47  
     48 #if 0 
     49@@ -627,7 +628,7 @@ 
     50 extern int telnet_main(int argc, char** argv) 
     51 { 
     52        int len; 
     53-       struct sockaddr_in s_in; 
     54+       struct sockaddr_in s_in, src_in; 
     55 #ifdef USE_POLL 
     56        struct pollfd ufds[2]; 
     57 #else 
     58@@ -635,9 +636,7 @@ 
     59        int maxfd; 
     60 #endif 
     61  
     62-#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN 
     63        int opt; 
     64-#endif 
     65  
     66 #ifdef CONFIG_FEATURE_AUTOWIDTH 
     67        get_terminal_width_height(0, &win_width, &win_height); 
     68@@ -648,6 +647,7 @@ 
     69 #endif 
     70  
     71        memset(&G, 0, sizeof G); 
     72+       memset(&src_in, 0, sizeof src_in); 
     73  
     74        if (tcgetattr(0, &G.termios_def) < 0) 
     75                exit(1); 
     76@@ -660,14 +660,38 @@ 
     77  
     78 #ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN 
     79        autologin = NULL; 
     80-       while ((opt = getopt(argc, argv, "al:")) != EOF) { 
     81+#define GETOPT_STRING "al:I:" 
     82+#else 
     83+#define GETOPT_STRING "I:" 
     84+#endif 
     85+       while ((opt = getopt(argc, argv, GETOPT_STRING)) != EOF) { 
     86                switch (opt) { 
     87+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN 
     88                        case 'l': 
     89                                autologin = optarg; 
     90                                break; 
     91                        case 'a': 
     92                                autologin = getenv("USER"); 
     93                                break; 
     94+#endif 
     95+                       case 'b': 
     96+                               { 
     97+                                       char dummy; 
     98+                                       int i1, i2, i3, i4; 
     99+                                       if (sscanf(optarg, "%u.%u.%u.%u%c", 
     100+                                                          &i1, &i2, &i3, &i4, &dummy) == 4) { 
     101+                                               unsigned char* ptr; 
     102+                                               ptr = (unsigned char*)&src_in.sin_addr; 
     103+                                               ptr[0] = i1; 
     104+                                               ptr[1] = i2; 
     105+                                               ptr[2] = i3; 
     106+                                               ptr[3] = i4; 
     107+                                       } 
     108+                                       else { 
     109+                                               bb_show_usage(); 
     110+                                       } 
     111+                               } 
     112+                               break; 
     113                        case '?': 
     114                                bb_show_usage(); 
     115                                break; 
     116@@ -681,12 +705,18 @@ 
     117                        bb_show_usage(); 
     118        } else 
     119                bb_show_usage(); 
     120-#else 
     121-       bb_lookup_host(&s_in, argv[1]); 
     122-       s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23); 
     123-#endif 
     124  
     125-       G.netfd = xconnect(&s_in); 
     126+       G.netfd = socket(AF_INET, SOCK_STREAM, 0); 
     127+       if (src_in.sin_addr.s_addr != 0) { 
     128+               if (bind(G.netfd, (struct sockaddr*)&src_in, sizeof(src_in)) == -1) 
     129+                       bb_perror_msg_and_die("Unable to bind local address (%s)", 
     130+                                                                 inet_ntoa(src_in.sin_addr)); 
     131+       } 
     132+       if (connect(G.netfd, &s_in, sizeof(s_in)) < 0) { 
     133+               bb_perror_msg_and_die("Unable to connect to remote host (%s)", 
     134+                                                         inet_ntoa(s_in.sin_addr)); 
     135+       } 
     136+       /*G.netfd = xconnect(&s_in);*/ 
     137  
     138        setsockopt(G.netfd, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one); 
     139