source: freewrt/package/busybox/patches/350-ping-opt-srcaddr.patch@ 1d8c05f

freewrt_1_0 freewrt_2_0
Last change on this file since 1d8c05f was 1d8c05f, checked in by Markus Wigge <markus@…>, 19 years ago
  • patch to add -I <src-IP> to ping

git-svn-id: svn://www.freewrt.org/trunk/freewrt@324 afb5a338-a214-0410-bd46-81f09a774fd1

  • Property mode set to 100644
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  
    23502350        "Options:\n" \
    23512351        "\t-c COUNT\tSend only COUNT pings\n" \
    23522352        "\t-s SIZE\t\tSend SIZE data bytes in packets (default=56)\n" \
     2353        "\t-I IPADDR\tUse IPADDR as source address.\n" \
    23532354        "\t-q\t\tQuiet mode, only displays output at start\n" \
    23542355        "\t\t\tand when finished"
    23552356#endif
  • networking/ping.c

    diff -Nur busybox-1.1.3.orig/networking/ping.c busybox-1.1.3/networking/ping.c
    old new  
    153153#else /* ! CONFIG_FEATURE_FANCY_PING */
    154154/* full(er) version */
    155155static struct sockaddr_in pingaddr;
     156static struct sockaddr_in sourceaddr;
    156157static int pingsock = -1;
    157158static int datalen; /* intentionally uninitialized to work around gcc bug */
    158159
     
    330331
    331332        pingsock = create_icmp_socket();
    332333
     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
    333339        memset(&pingaddr, 0, sizeof(struct sockaddr_in));
    334340
    335341        pingaddr.sin_family = AF_INET;
     
    349355        setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt,
    350356                           sizeof(sockopt));
    351357
    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);
    356366
    357367        signal(SIGINT, pingstats);
    358368
     
    388398        argc--;
    389399        argv++;
    390400        options = 0;
     401        memset(&sourceaddr, 0, sizeof(sourceaddr));
    391402        /* Parse any options */
    392403        while (argc >= 1 && **argv == '-') {
    393404                thisarg = *argv;
     
    408419                        argv++;
    409420                        datalen = atoi(*argv);
    410421                        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;
    411443                default:
    412444                        bb_show_usage();
    413445                }
Note: See TracBrowser for help on using the repository browser.