diff options
Diffstat (limited to 'networking')
-rw-r--r-- | networking/ping.c | 85 | ||||
-rw-r--r-- | networking/ping6.c | 92 |
2 files changed, 65 insertions, 112 deletions
diff --git a/networking/ping.c b/networking/ping.c index 782b801..400d565 100644 --- a/networking/ping.c +++ b/networking/ping.c @@ -41,17 +41,10 @@ enum { PINGINTERVAL = 1 /* second */ }; -#define O_QUIET (1 << 0) - -#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */ -#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */ -#define SET(bit) (A(bit) |= B(bit)) -#define CLR(bit) (A(bit) &= (~B(bit))) -#define TST(bit) (A(bit) & B(bit)) - static void ping(const char *host); /* common routines */ + static int in_cksum(unsigned short *buf, int sz) { int nleft = sz; @@ -75,8 +68,10 @@ static int in_cksum(unsigned short *buf, int sz) return (ans); } -/* simple version */ #ifndef CONFIG_FEATURE_FANCY_PING + +/* simple version */ + static char *hostname; static void noresp(int ign) @@ -153,14 +148,21 @@ int ping_main(int argc, char **argv) } #else /* ! CONFIG_FEATURE_FANCY_PING */ + /* full(er) version */ + +#define OPT_STRING "qc:s:I:" +enum { + OPT_QUIET = 1 << 0, +}; + static struct sockaddr_in pingaddr; static struct sockaddr_in sourceaddr; static int pingsock = -1; static unsigned datalen; /* intentionally uninitialized to work around gcc bug */ static unsigned long ntransmitted, nreceived, nrepeats, pingcount; -static int myid, options; +static int myid; static unsigned long tmin = ULONG_MAX, tmax, tsum; static char rcvd_tbl[MAX_DUP_CHK / 8]; @@ -170,6 +172,12 @@ static void sendping(int); static void pingstats(int); static void unpack(char *, int, struct sockaddr_in *); +#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */ +#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */ +#define SET(bit) (A(bit) |= B(bit)) +#define CLR(bit) (A(bit) &= (~B(bit))) +#define TST(bit) (A(bit) & B(bit)) + /**************************************************************************/ static void pingstats(int junk) @@ -304,7 +312,7 @@ static void unpack(char *buf, int sz, struct sockaddr_in *from) dupflag = 0; } - if (options & O_QUIET) + if (option_mask32 & OPT_QUIET) return; printf("%d bytes from %s: icmp_seq=%u", sz, @@ -409,55 +417,26 @@ static int parse_nipquad(const char *str, struct sockaddr_in* addr) int ping_main(int argc, char **argv) { - char *thisarg; + char *opt_c, *opt_s, *opt_I; datalen = DEFDATALEN; /* initialized here rather than in global scope to work around gcc bug */ - argc--; - argv++; - /* Parse any options */ - while (argc >= 1 && **argv == '-') { - thisarg = *argv; - thisarg++; - switch (*thisarg) { - case 'q': - options |= O_QUIET; - break; - case 'c': - if (--argc <= 0) - bb_show_usage(); - argv++; - pingcount = xatoul(*argv); - break; - case 's': - if (--argc <= 0) - bb_show_usage(); - argv++; - datalen = xatou16(*argv); - break; - case 'I': - if (--argc <= 0) - bb_show_usage(); - argv++; -/* ping6 accepts iface too: - if_index = if_nametoindex(*argv); - if (!if_index) ... - make it true for ping too. TODO. -*/ - if (parse_nipquad(*argv, &sourceaddr)) - bb_show_usage(); - break; - default: + /* exactly one argument needed */ + opt_complementary = "=1"; + getopt32(argc, argv, OPT_STRING, &opt_c, &opt_s, &opt_I); + if (option_mask32 & 2) pingcount = xatoul(opt_c); // -c + if (option_mask32 & 4) datalen = xatou16(opt_s); // -s + if (option_mask32 & 8) { // -I +/* TODO: ping6 accepts iface too: + if_index = if_nametoindex(*argv); + if (!if_index) ... +make it true for ping. */ + if (parse_nipquad(opt_I, &sourceaddr)) bb_show_usage(); - } - argc--; - argv++; } - if (argc < 1) - bb_show_usage(); myid = (int16_t) getpid(); - ping(*argv); + ping(argv[optind]); return EXIT_SUCCESS; } #endif /* ! CONFIG_FEATURE_FANCY_PING */ diff --git a/networking/ping6.c b/networking/ping6.c index af9c00e..6ab9ce0 100644 --- a/networking/ping6.c +++ b/networking/ping6.c @@ -53,19 +53,12 @@ enum { PINGINTERVAL = 1 /* second */ }; -#define O_QUIET (1 << 0) -#define O_VERBOSE (1 << 1) - -#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */ -#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */ -#define SET(bit) (A(bit) |= B(bit)) -#define CLR(bit) (A(bit) &= (~B(bit))) -#define TST(bit) (A(bit) & B(bit)) - static void ping(const char *host); -/* simple version */ #ifndef CONFIG_FEATURE_FANCY_PING6 + +/* simple version */ + static struct hostent *h; static void noresp(int ign) @@ -142,14 +135,22 @@ int ping6_main(int argc, char **argv) } #else /* ! CONFIG_FEATURE_FANCY_PING6 */ + /* full(er) version */ + +#define OPT_STRING "qvc:s:I:" +enum { + OPT_QUIET = 1 << 0, + OPT_VERBOSE = 1 << 1, +}; + static struct sockaddr_in6 pingaddr; static int pingsock = -1; static unsigned datalen; /* intentionally uninitialized to work around gcc bug */ static int if_index; static unsigned long ntransmitted, nreceived, nrepeats, pingcount; -static int myid, options; +static int myid; static unsigned long tmin = ULONG_MAX, tmax, tsum; static char rcvd_tbl[MAX_DUP_CHK / 8]; @@ -159,6 +160,12 @@ static void sendping(int); static void pingstats(int); static void unpack(char *, int, struct sockaddr_in6 *, int); +#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */ +#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */ +#define SET(bit) (A(bit) |= B(bit)) +#define CLR(bit) (A(bit) &= (~B(bit))) +#define TST(bit) (A(bit) & B(bit)) + /**************************************************************************/ static void pingstats(int junk) @@ -294,7 +301,7 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit dupflag = 0; } - if (options & O_QUIET) + if (option_mask32 & OPT_QUIET) return; printf("%d bytes from %s: icmp6_seq=%u", sz, @@ -336,7 +343,7 @@ static void ping(const char *host) #ifdef ICMP6_FILTER { struct icmp6_filter filt; - if (!(options & O_VERBOSE)) { + if (!(option_mask32 & OPT_VERBOSE)) { ICMP6_FILTER_SETBLOCKALL(&filt); ICMP6_FILTER_SETPASS(ICMP6_ECHO_REPLY, &filt); } else { @@ -416,57 +423,24 @@ static void ping(const char *host) int ping6_main(int argc, char **argv) { - char *thisarg; + char *opt_c, *opt_s, *opt_I; datalen = DEFDATALEN; /* initialized here rather than in global scope to work around gcc bug */ - argc--; - argv++; - /* Parse any options */ - while (argc >= 1 && **argv == '-') { - thisarg = *argv; - thisarg++; - switch (*thisarg) { - case 'v': - options &= ~O_QUIET; - options |= O_VERBOSE; - break; - case 'q': - options &= ~O_VERBOSE; - options |= O_QUIET; - break; - case 'c': - if (--argc <= 0) - bb_show_usage(); - argv++; - pingcount = xatoul(*argv); - break; - case 's': - if (--argc <= 0) - bb_show_usage(); - argv++; - datalen = xatou16(*argv); - break; - case 'I': - if (--argc <= 0) - bb_show_usage(); - argv++; - if_index = if_nametoindex(*argv); - if (!if_index) - bb_error_msg_and_die( - "%s: invalid interface name", *argv); - break; - default: - bb_show_usage(); - } - argc--; - argv++; + /* exactly one argument needed, -v and -q don't mix */ + opt_complementary = "=1:q--v:v--q"; + getopt32(argc, argv, OPT_STRING, &opt_c, &opt_s, &opt_I); + if (option_mask32 & 4) pingcount = xatoul(opt_c); // -c + if (option_mask32 & 8) datalen = xatou16(opt_s); // -s + if (option_mask32 & 0x10) { // -I + if_index = if_nametoindex(opt_I); + if (!if_index) + bb_error_msg_and_die( + "%s: invalid interface name", opt_I); } - if (argc < 1) - bb_show_usage(); - myid = (int16_t) getpid(); - ping(*argv); + myid = (int16_t)getpid(); + ping(argv[optind]); return EXIT_SUCCESS; } #endif /* ! CONFIG_FEATURE_FANCY_PING6 */ |