source:
freewrt/package/busybox/patches/350-ping-opt-srcaddr.patch@
1d8c05f
| Last change on this file since 1d8c05f was 1d8c05f, checked in by , 19 years ago | |
|---|---|
|
|
| File size: 2.6 KB | |
-
include/usage.h
diff -Nur busybox-1.1.3.orig/include/usage.h busybox-1.1.3/include/usage.h
old new 2350 2350 "Options:\n" \ 2351 2351 "\t-c COUNT\tSend only COUNT pings\n" \ 2352 2352 "\t-s SIZE\t\tSend SIZE data bytes in packets (default=56)\n" \ 2353 "\t-I IPADDR\tUse IPADDR as source address.\n" \ 2353 2354 "\t-q\t\tQuiet mode, only displays output at start\n" \ 2354 2355 "\t\t\tand when finished" 2355 2356 #endif -
networking/ping.c
diff -Nur busybox-1.1.3.orig/networking/ping.c busybox-1.1.3/networking/ping.c
old new 153 153 #else /* ! CONFIG_FEATURE_FANCY_PING */ 154 154 /* full(er) version */ 155 155 static struct sockaddr_in pingaddr; 156 static struct sockaddr_in sourceaddr; 156 157 static int pingsock = -1; 157 158 static int datalen; /* intentionally uninitialized to work around gcc bug */ 158 159 … … 330 331 331 332 pingsock = create_icmp_socket(); 332 333 334 if (sourceaddr.sin_addr.s_addr != 0) { 335 if (bind(pingsock, (struct sockaddr*)&sourceaddr, sizeof(sourceaddr)) == -1) 336 bb_error_msg_and_die("could not bind to address"); 337 } 338 333 339 memset(&pingaddr, 0, sizeof(struct sockaddr_in)); 334 340 335 341 pingaddr.sin_family = AF_INET; … … 349 355 setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt, 350 356 sizeof(sockopt)); 351 357 352 printf("PING %s (%s): %d data bytes\n", 353 hostent->h_name, 354 inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr), 355 datalen); 358 printf("PING %s (%s)", 359 hostent->h_name, 360 inet_ntoa(*(struct in_addr *) &pingaddr.sin_addr.s_addr)); 361 if (sourceaddr.sin_addr.s_addr != 0) { 362 printf(" from %s", 363 inet_ntoa(*(struct in_addr *) &sourceaddr.sin_addr.s_addr)); 364 } 365 printf(": %d data bytes\n", datalen); 356 366 357 367 signal(SIGINT, pingstats); 358 368 … … 388 398 argc--; 389 399 argv++; 390 400 options = 0; 401 memset(&sourceaddr, 0, sizeof(sourceaddr)); 391 402 /* Parse any options */ 392 403 while (argc >= 1 && **argv == '-') { 393 404 thisarg = *argv; … … 408 419 argv++; 409 420 datalen = atoi(*argv); 410 421 break; 422 case 'I': 423 if (--argc <= 0) 424 bb_show_usage(); 425 argv++; 426 { 427 char dummy; 428 int i1, i2, i3, i4; 429 if (sscanf(*argv, "%u.%u.%u.%u%c", 430 &i1, &i2, &i3, &i4, &dummy) == 4) { 431 unsigned char* ptr; 432 ptr = (unsigned char*)&sourceaddr.sin_addr; 433 ptr[0] = i1; 434 ptr[1] = i2; 435 ptr[2] = i3; 436 ptr[3] = i4; 437 } 438 else { 439 bb_show_usage(); 440 } 441 } 442 break; 411 443 default: 412 444 bb_show_usage(); 413 445 }
Note:
See TracBrowser
for help on using the repository browser.
