]> 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>
Tue, 31 Jan 2017 11:31:49 +0000 (12:31 +0100)
ChangeLog
ci/test-02-help.pl
doc/fping.pod
src/fping.c

index 087ecbdf37efe5760531a51d301acf254f7724ea..4cff164f86887485a0f743ffdde8448981bbf17b 100644 (file)
--- 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
index 717a9b0f91a1cbc85184e7432a90c21e17550d7f..d3efe26f73e52f188d25f9bf5a6496632e31d948 100755 (executable)
@@ -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)
index 922ea932ca747b4df817a400f53025a9d72f03de..0b3917f2b7bbdc9e0276ddf18bce89b3285a780f 100644 (file)
@@ -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>
 
index df5d934cb5ee991bd2ed4ffb8baf841acc756cfa..ff56162ded30acd3e374024d4bfbb797d6a5e565 100644 (file)
@@ -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" );