]> git.gsnw.org Git - fping.git/commitdiff
Print returned TTL value
authorNuno Alves <nuno.alves02@gmail.com>
Wed, 21 Aug 2024 22:07:28 +0000 (23:07 +0100)
committerErik Auerswald <auerswal@unix-ag.uni-kl.de>
Sat, 31 Aug 2024 12:20:31 +0000 (14:20 +0200)
Co-authored-by: Luís Fonseca <luis@lhf.pt>
ci/test-04-options-a-b.pl
ci/test-11-unpriv.pl
doc/fping.pod
src/fping.c

index dc5435cc22ea8a38c0410b442e8690dec30717f2..1e16ee3d6d194497f6c64b08df974deb9ef0fe4a 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 
-use Test::Command tests => 32;
+use Test::Command tests => 41;
 use Test::More;
 use Time::HiRes qw(gettimeofday tv_interval);
 
@@ -68,6 +68,33 @@ $cmd->stdout_is_eq("127.0.0.1\n127.0.0.2\n");
 $cmd->stderr_is_eq("");
 }
 
+# fping -a --print-ttl
+{
+my $cmd = Test::Command->new(cmd => "fping -a --print-ttl 127.0.0.1 127.0.0.2");
+$cmd->exit_is_num(0);
+$cmd->stdout_like(qr{127\.0\.0\.1 \(TTL \d+\)\n127\.0\.0\.2 \(TTL \d+\)\n});
+$cmd->stderr_is_eq("");
+}
+
+# fping --print-ttl
+{
+my $cmd = Test::Command->new(cmd => "fping --print-ttl 127.0.0.1");
+$cmd->exit_is_num(0);
+$cmd->stdout_like(qr{127\.0\.0\.1 is alive \(TTL \d+\)});
+$cmd->stderr_is_eq("");
+}
+
+# fping --print-ttl with IPv6
+SKIP: {
+    if($ENV{SKIP_IPV6}) {
+        skip 'Skip IPv6 tests', 3;
+    }
+    my $cmd = Test::Command->new(cmd => "fping --print-ttl ::1");
+    $cmd->exit_is_num(0);
+    $cmd->stdout_like(qr{::1 is alive \(TTL unknown\)\n});
+    $cmd->stderr_is_eq("");
+}
+
 # fping -A
 {
 my $cmd = Test::Command->new(cmd => "fping -4 -A localhost");
index 74deb6a4c85a75bc29dfa2e5bbd467b6df512a21..debf2afb809f1cf1462c3b0feaf67309f76d57ad 100755 (executable)
@@ -40,7 +40,7 @@ else {
 }
 
 sub test_unprivileged_works {
-    plan tests => 12;
+    plan tests => 15;
 
     {
         my $cmd = Test::Command->new(cmd => "$fping_copy 127.0.0.1");
@@ -54,6 +54,12 @@ sub test_unprivileged_works {
         $cmd->stdout_is_eq("127.0.0.1 is alive (TOS unknown)\n");
         $cmd->stderr_is_eq("");
     }
+    {
+        my $cmd = Test::Command->new(cmd => "$fping_copy --print-ttl 127.0.0.1");
+        $cmd->exit_is_num(0);
+        $cmd->stdout_is_eq("127.0.0.1 is alive (TTL unknown)\n");
+        $cmd->stderr_is_eq("");
+    }
     SKIP: {
         if($^O ne 'linux') {
             skip '-k option is only supported on Linux', 3;
index 3f4ac5f2766c0edb598e0031ba17c01597f4f886..e20ed304657c185f51a5b9fc9ecfc53c95a637c4 100644 (file)
@@ -140,6 +140,12 @@ Print usage message.
 
 Set the IP TTL field (time to live hops).
 
+=item B<--print-ttl>
+
+Displays the IPv4 TTL value from the IP Header in the output.
+If B<fping> cannot read the TTL value, "(TTL unknown)" is returned.
+IPv4 only, requires root privileges or cap_net_raw.
+
 =item B<-i>, B<--interval>=I<MSEC>
 
 The minimum amount of time (in milliseconds) between sending a ping packet
index ae5986ff1d556d083c1aa6a0af96568bc8958995..709ae62018692fe842aceacd58a0c4faeeb3a84d 100644 (file)
@@ -362,6 +362,7 @@ int random_data_flag = 0;
 int cumulative_stats_flag = 0;
 int check_source_flag = 0;
 int print_tos_flag = 0;
+int print_ttl_flag = 0;
 #if defined(DEBUG) || defined(_DEBUG)
 int randomly_lose_flag, trace_flag, print_per_system_flag;
 int lose_factor;
@@ -560,6 +561,7 @@ int main(int argc, char **argv)
         { "fast-reachable", 'X', OPTPARSE_REQUIRED },
         { "check-source", '0', OPTPARSE_NONE },
         { "print-tos", '0', OPTPARSE_NONE },
+        { "print-ttl", '0', OPTPARSE_NONE },
 #if defined(DEBUG) || defined(_DEBUG)
         { NULL, 'z', OPTPARSE_REQUIRED },
 #endif
@@ -584,6 +586,8 @@ int main(int argc, char **argv)
                 check_source_flag = 1;
             } else if (strstr(optparse_state.optlongname, "print-tos") != NULL) {
                 print_tos_flag = 1;
+            } else if (strstr(optparse_state.optlongname, "print-ttl") != NULL) {
+                print_ttl_flag = 1;
             } else {
                 usage(1);
             }
@@ -2164,7 +2168,8 @@ int decode_icmp_ipv4(
     size_t reply_buf_len,
     unsigned short *id,
     unsigned short *seq,
-    int *ip_header_tos)
+    int *ip_header_tos,
+    int *ip_header_ttl)
 {
     struct icmp *icp;
     int hlen = 0;
@@ -2172,6 +2177,7 @@ int decode_icmp_ipv4(
     if (!using_sock_dgram4) {
         struct ip *ip = (struct ip *)reply_buf;
         *ip_header_tos = ip->ip_tos;
+        *ip_header_ttl = ip->ip_ttl;
 
 #if defined(__alpha__) && __STDC__ && !defined(__GLIBC__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
         /* The alpha headers are decidedly broken.
@@ -2373,6 +2379,7 @@ int wait_for_reply(int64_t wait_time)
     unsigned short id;
     unsigned short seq;
     int ip_header_tos = -1;
+    int ip_header_ttl = -1;
 
     /* Receive packet */
     result = receive_packet(wait_time, /* max. wait time, in ns */
@@ -2400,7 +2407,8 @@ int wait_for_reply(int64_t wait_time)
             sizeof(buffer),
             &id,
             &seq,
-            &ip_header_tos);
+            &ip_header_tos,
+            &ip_header_ttl);
         if (ip_hlen < 0) {
             return 1;
         }
@@ -2518,6 +2526,15 @@ int wait_for_reply(int64_t wait_time)
                   }
             }
 
+            if (print_ttl_flag) {
+              if(ip_header_ttl != -1) {
+                  printf(" (TTL %d)", ip_header_ttl);
+              }
+              else {
+                  printf(" (TTL unknown)");
+              }
+            }
+
             if (elapsed_flag)
                 printf(" (%s ms)", sprint_tm(this_reply));
 
@@ -3088,5 +3105,6 @@ void usage(int is_error)
     fprintf(out, "   -x, --reachable=N  shows if >=N hosts are reachable or not\n");
     fprintf(out, "   -X, --fast-reachable=N exits true immediately when N hosts are found\n");
     fprintf(out, "       --print-tos    show tos value\n");
+    fprintf(out, "       --print-ttl    show IP TTL value\n");
     exit(is_error);
 }