]> git.gsnw.org Git - fping.git/commitdiff
Fix option -m to return all IPs of a hostname
authorDavid Schweikert <david@schweikert.ch>
Tue, 31 Jan 2017 11:31:49 +0000 (12:31 +0100)
committerDavid Schweikert <david@schweikert.ch>
Fri, 3 Feb 2017 08:55:23 +0000 (09:55 +0100)
ChangeLog
ci/test-02-help.pl
doc/fping.pod
src/fping.c

index 7f9267a4c3749aec2cdf326940dfd02c5727d419..655f3427d3c0d2b60c0d470b6a5b1f819aa87364 100644 (file)
--- 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)
 
index 2c70b53d451e787f4b5e83af361d8d17b7e1eabd..83446ac5367cf363a510258ecbdec1b177e7f5c8 100755 (executable)
@@ -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)
index d38bec22489c960cb7fee9eb94b1e50e08f443c8..e4acfd29d06c99ba82b78b0881f9834a875596de 100644 (file)
@@ -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>
 
index 50991ddd56490376d38b1f3e57000d7d78d1b69f..88a10b77ab2f13befec139a2597d32b9b0e59035 100644 (file)
@@ -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" );