Add ping -l (preload) and telnet -b (bind alias), closes #528
[openwrt/svn-archive/archive.git] / openwrt / package / busybox / patches / 350-ping-opt-srcaddr.patch
1 diff -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
12 diff -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 }