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
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."
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
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 */
25 pingsock = create_icmp_socket();
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");
32 memset(&pingaddr, 0, sizeof(struct sockaddr_in));
34 pingaddr.sin_family = AF_INET;
36 setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt,
39 - printf("PING %s (%s): %d data bytes\n",
40 + printf("PING %s (%s)",
42 - inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr),
44 + inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr));
45 + if (sourceaddr.sin_addr.s_addr != 0) {
47 + inet_ntoa(*(struct in_addr *) &sourceaddr.sin_addr.s_addr));
49 + printf(": %d data bytes\n", datalen);
51 signal(SIGINT, pingstats);
57 + memset(&sourceaddr, 0, sizeof(sourceaddr));
58 /* Parse any options */
59 while (argc >= 1 && **argv == '-') {
63 datalen = atoi(*argv);
72 + if (sscanf(*argv, "%u.%u.%u.%u%c",
73 + &i1, &i2, &i3, &i4, &dummy) == 4) {
75 + ptr = (unsigned char*)&sourceaddr.sin_addr;