From 35d52d0b30448f5a07f673cda5828382df087590 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 | 22 ++++++++++++++-------- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 087ecbd..4cff164 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ Unreleased * (feature) New option '-6' to force IPv6 * (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 option -H (ttl) for IPv6 * (bugfix) Fix option -M (don't fragment) for IPv6 * (bugfix) Fix option -O (ToS) for IPv6 diff --git a/ci/test-02-help.pl b/ci/test-02-help.pl index 717a9b0..d3efe26 100755 --- a/ci/test-02-help.pl +++ b/ci/test-02-help.pl @@ -28,7 +28,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 922ea93..0b3917f 100644 --- a/doc/fping.pod +++ b/doc/fping.pod @@ -134,7 +134,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 df5d934..ff56162 100644 --- a/src/fping.c +++ b/src/fping.c @@ -2260,7 +2260,7 @@ void add_name( char *name ) * 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) { + for (res = res0; res; res = res->ai_next) { /* name_flag: addr -> name lookup requested) */ if(!name_flag) { printname = name; @@ -2271,12 +2271,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++; - continue; + printname = name; + } + else { + printname = namebuf; } - printname = namebuf; } /* addr_flag: name -> addr lookup requested */ @@ -2286,9 +2289,8 @@ 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++; continue; } @@ -2304,6 +2306,10 @@ void add_name( char *name ) else { add_addr(name, printname, res->ai_addr, res->ai_addrlen); } + + if(!multif_flag) { + break; + } } freeaddrinfo(res0); @@ -2747,7 +2753,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" );