From cc8043b7a64f0641f5bf695d876bfe205b24e4e2 Mon Sep 17 00:00:00 2001 From: David Schweikert Date: Tue, 31 Jan 2017 12:31:49 +0100 Subject: [PATCH] Fix option -m to return all IPs of a hostname --- ChangeLog | 1 + ci/test-02-help.pl | 2 +- doc/fping.pod | 3 ++- src/fping.c | 34 +++++++++++++++++++--------------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7f9267a..655f342 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ Unreleased * (feature) Support kernel-timestamping of received packets (#46) * (feature) Simplify restrictions: only -i >= 1 and -p >= 10 are enforced now + * (bugfix) Fix option -m to return all IPs of a hostname * (bugfix) Fix compatibility issue with AIX (#69, @blentzgh) * (bugfix) Fix -q not suppressing some ICMP error messages (#83) diff --git a/ci/test-02-help.pl b/ci/test-02-help.pl index 2c70b53..83446ac 100755 --- a/ci/test-02-help.pl +++ b/ci/test-02-help.pl @@ -26,7 +26,7 @@ Usage: fping [options] [targets...] -H n Set the IP TTL value (Time To Live hops) -i n interval between sending ping packets (in millisec) (default 25) ${I_HELP} -l loop sending pings forever - -m ping multiple interfaces on target host + -m use all IPs of provided hostnames (e.g. IPv4 and IPv6), use with -A -M set the Don't Fragment flag -n show targets by name (-d is equivalent) -N output compatible for netdata (-l -Q are required) diff --git a/doc/fping.pod b/doc/fping.pod index d38bec2..e4acfd2 100644 --- a/doc/fping.pod +++ b/doc/fping.pod @@ -125,7 +125,8 @@ Ctrl-C; statistics about responses for each target are then displayed. =item B<-m> -Send pings to each of a target host's multiple interfaces. +Send pings to each of a target host's multiple IP addresses (use of option '-A' +is recommended). =item B<-M> diff --git a/src/fping.c b/src/fping.c index 50991dd..88a10b7 100644 --- a/src/fping.c +++ b/src/fping.c @@ -2074,12 +2074,12 @@ void add_name( char *name ) return; } - // NOTE: we could/should loop with res on all addresses like this: - // for (res = res0; res; res = res->ai_next) { - // We don't do it yet, however, because is is an incompatible change - // (need to implement a separate option for this) - - for (res = res0; res; res = 0) { + /* NOTE: we could/should loop with res on all addresses like this: + * for (res = res0; res; res = res->ai_next) { + * We don't do it yet, however, because is is an incompatible change + * (need to implement a separate option for this) + */ + for (res = res0; res; res = res->ai_next) { /* name_flag: addr -> name lookup requested) */ if(!name_flag) { printname = name; @@ -2090,12 +2090,15 @@ void add_name( char *name ) sizeof(namebuf)/sizeof(char), NULL, 0, 0); if (ret) { if(!quiet_flag) { - print_warning("%s: %s\n", name, gai_strerror(ret_ga)); + ret = getnameinfo(res->ai_addr, res->ai_addrlen, namebuf, + sizeof(namebuf)/sizeof(char), NULL, 0, 0); + print_warning("%s: can't reverse-lookup (%s)\n", name, gai_strerror(ret_ga)); } - num_noaddress++; - return; + printname = name; + } + else { + printname = namebuf; } - printname = namebuf; } /* addr_flag: name -> addr lookup requested */ @@ -2105,10 +2108,9 @@ void add_name( char *name ) sizeof(addrbuf)/sizeof(char), NULL, 0, NI_NUMERICHOST); if (ret) { if(!quiet_flag) { - print_warning("%s: %s\n", name, gai_strerror(ret_ga)); + print_warning("%s: can't forward-lookup address (%s)\n", name, gai_strerror(ret_ga)); } - num_noaddress++; - return; + continue; } if(name_flag) { @@ -2124,7 +2126,9 @@ void add_name( char *name ) add_addr(name, printname, res->ai_addr, res->ai_addrlen); } - return; + if(!multif_flag) { + break; + } } } /* add_name() */ @@ -2618,7 +2622,7 @@ void usage(int is_error) fprintf(out, " -I if bind to a particular interface\n"); #endif fprintf(out, " -l loop sending pings forever\n" ); - fprintf(out, " -m ping multiple interfaces on target host\n" ); + fprintf(out, " -m use all IPs of provided hostnames (e.g. IPv4 and IPv6), use with -A\n" ); fprintf(out, " -M set the Don't Fragment flag\n" ); fprintf(out, " -n show targets by name (-d is equivalent)\n" ); fprintf(out, " -N output compatible for netdata (-l -Q are required)\n" );