]> git.gsnw.org Git - fping.git/commitdiff
Change --print-srcaddr to --print-reply-dst
authorGerman Service Network <support@gsnw.de>
Fri, 31 Jul 2026 13:38:53 +0000 (15:38 +0200)
committerSebastian <176771227+gsnw-sebast@users.noreply.github.com>
Sat, 8 Aug 2026 06:32:20 +0000 (08:32 +0200)
CHANGELOG.md
ci/test-11-unpriv.pl
ci/test-16-json-output.pl
doc/fping-json.md
doc/fping.pod
src/flags.c
src/flags.h
src/fping.c
src/fping.h
src/output.c

index b087d40efafda565029a635c569d2704d1d2a5a4..94c421e73e402cf5de0ccf3db138355a7092e1f3 100644 (file)
@@ -3,7 +3,7 @@ Next
 
 ## New features
 
-- New option --print-srcaddr to show used IP source address in output (#461, thanks @gsnw-sebast)
+- New option --print-reply-dst to show the destination address of the received reply packet (#461, thanks @gsnw-sebast)
 - New option --oiface for outgoing interface (#463, thanks @gsnw-sebast)
 
 ## Bugfixes and other changes
index 5bd13d54c1168350575813c8532e94b737605ff3..f1397783be0182f3de928a89b251a7d36a7aa64e 100755 (executable)
@@ -49,9 +49,9 @@ sub test_unprivileged_works {
         $cmd->stderr_is_eq("");
     }
     {
-        my $cmd = Test::Command->new(cmd => "$fping_copy --print-srcaddr 127.0.0.1");
+        my $cmd = Test::Command->new(cmd => "$fping_copy --print-reply-dst 127.0.0.1");
         $cmd->exit_is_num(0);
-        $cmd->stdout_like(qr{127\.0\.0\.1 is alive \(SRC (?:\d+\.\d+\.\d+\.\d+|unknown)\)\n});
+        $cmd->stdout_like(qr{127\.0\.0\.1 is alive \(Reply-DST (?:\d+\.\d+\.\d+\.\d+|unknown)\)\n});
         $cmd->stderr_is_eq("");
     }
     {
index f4add6acc9349fd7cb0669319d43f1e5bad7f769..5f29f381ed843e983c41516308a7dd833c0e6d7c 100644 (file)
@@ -99,9 +99,9 @@ $cmd->stderr_is_eq("");
 }
 
 # fping -J -c 1 --print-srcaddr 127.0.0.1
-my $cmd = Test::Command->new(cmd => "fping -J -c 1 --print-srcaddr 127.0.0.1");
+my $cmd = Test::Command->new(cmd => "fping -J -c 1 --print-reply-dst 127.0.0.1");
 $cmd->exit_is_num(0);
-$cmd->stdout_like(qr/^\{"resp":\s\{"host":\s"127\.0\.0\.1",\s"seq":\s0,\s"size":\s\d+,\s"rtt":\s\d+\.\d+,\s"src":\s"\d+\.\d+\.\d+\.\d+"\}\}
+$cmd->stdout_like(qr/^\{"resp":\s\{"host":\s"127\.0\.0\.1",\s"seq":\s0,\s"size":\s\d+,\s"rtt":\s\d+\.\d+,\s"replyDst":\s"\d+\.\d+\.\d+\.\d+"\}\}
 \{"summary":\s\{"host":\s"127\.0\.0\.1",\s"xmt":\s\d+,\s"rcv":\s\d+,\s"loss":\s\d+,\s"rttMin":\s\d+\.\d+,\s"rttAvg":\s\d+\.\d+,\s"rttMax":\s\d+\.\d+\}\}\n?$/);
 $cmd->stderr_is_eq("");
 
index 6f1acd879b379cbba937238a81cf7d47b1839e24..3dadb84ad78e3ab3fdcf6af5d2dc8a68cae4f854 100644 (file)
@@ -82,7 +82,7 @@ Generated when a ping reply is received.
   contains `originate`, `receive`, `transmit`, and `localreceive` timestamps.
 - `tos`: If `--print-tos` is used, contains the Type of Service value.
 - `ttl`: If `--print-ttl` is used, contains the Time To Live value.
-- `src`: If `--print-src` is used, contains the source IP address of the responding host.
+- `replyDst`: If `--print-reply-dst` is used, contains the destination address of the received reply packet.
 
 ### `timeout`: Timeout
 
index 5b2a07fe37ca0bfbd8d2003a6ddadeb327e7b782..2b3f075067aea0cbd160cfdd679c08192a36939b 100644 (file)
@@ -259,11 +259,12 @@ Print cumulative statistics upon exit.
 
 Set source address.
 
-=item B<--print-srcaddr>
+=item B<--print-reply-dst>
 
-Displays the used IP source address in the output. If B<fping> cannot read the source address,
-"(SRC unknown)" is returned.
-IPv6 is currently not supported.
+Displays the destination address of the received reply packet. (IPv6 is currently not supported).
+Note this reflects the address as seen on the reply packet, not necessarily the
+address the request was sent from. It is only printed for hosts that reply (not for timeouts),
+and NAT between fping and the target can make it differ from the request's source or the reply's real origin.
 
 =item B<--seqmap-timeout>=I<MSEC>
 
index bf2e9aca1bccca10d7c38611f445cef0e3240d7b..60bf48436aa87dc7cebcf165f5fd606ddcd9faa6 100644 (file)
@@ -32,7 +32,7 @@ int opt_print_netdata_on = 0;
 int opt_print_json_on = 0;
 int opt_print_tos_on = 0;
 int opt_print_ttl_on = 0;
-int opt_print_srcaddr_on = 0;
+int opt_print_reply_dst_on = 0;
 int opt_per_recv_on = 0;
 int opt_report_all_rtts_on = 0;
 int opt_name_on = 0;
index 84ff8bd633b18f8db4714903d9ca74dc576ff866..bcf332a9d9f9c59f756b31cd3ced9d0c619b99d5 100644 (file)
@@ -36,7 +36,7 @@ extern int opt_print_netdata_on;
 extern int opt_print_json_on;
 extern int opt_print_tos_on;
 extern int opt_print_ttl_on;
-extern int opt_print_srcaddr_on;
+extern int opt_print_reply_dst_on;
 extern int opt_per_recv_on;
 extern int opt_report_all_rtts_on;
 extern int opt_name_on;
index 4ada8fd989dbca9dbe8547b618bcfaf55806b25f..ba58e779b14b23b15f39ac811ee6d88cd85f6b55 100644 (file)
@@ -270,7 +270,7 @@ IP_HEADER_RESULT default_ip_header_result() {
     res.otime_ms = 0x80000000U;
     res.rtime_ms = 0x80000000U;
     res.ttime_ms = 0x80000000U;
-    res.src_addr[0] = '\0';
+    res.reply_dst_addr[0] = '\0';
     return res;
 }
 
@@ -541,7 +541,7 @@ int main(int argc, char **argv)
         { "check-source", 0, OPTPARSE_NONE },
         { "print-tos", 0, OPTPARSE_NONE },
         { "print-ttl", 0, OPTPARSE_NONE },
-        { "print-srcaddr", 0, OPTPARSE_NONE },
+        { "print-reply-dst", 0, OPTPARSE_NONE },
         { "seqmap-timeout", 0, OPTPARSE_REQUIRED },
 #if defined(DEBUG) || defined(_DEBUG)
         { NULL, 'z', OPTPARSE_REQUIRED },
@@ -605,8 +605,8 @@ int main(int argc, char **argv)
                     }
                 }
 #endif
-            } else if (strstr(optparse_state.optlongname, "print-srcaddr") != NULL) {
-                opt_print_srcaddr_on = 1;
+            } else if (strstr(optparse_state.optlongname, "print-reply-dst") != NULL) {
+                opt_print_reply_dst_on = 1;
             } else if (strstr(optparse_state.optlongname, "seqmap-timeout") != NULL) {
                 opt_seqmap_timeout = strtod_strict(optparse_state.optarg) * 1000000;
             } else if (strstr(optparse_state.optlongname, "oiface") != NULL) {
@@ -2366,10 +2366,10 @@ int decode_icmp_ipv4(
         ip_header_res->ttime_ms = ntohl(icp->icmp_dun.id_ts.its_ttime);
     }
 
-    if (opt_print_srcaddr_on) {
-        if (ip == NULL || inet_ntop(AF_INET, &ip->ip_dst, ip_header_res->src_addr, sizeof(ip_header_res->src_addr)) == NULL) {
-            strncpy(ip_header_res->src_addr, "unknown", sizeof(ip_header_res->src_addr) - 1);
-            ip_header_res->src_addr[sizeof(ip_header_res->src_addr) - 1] = '\0';
+    if (opt_print_reply_dst_on) {
+        if (ip == NULL || inet_ntop(AF_INET, &ip->ip_dst, ip_header_res->reply_dst_addr, sizeof(ip_header_res->reply_dst_addr)) == NULL) {
+            strncpy(ip_header_res->reply_dst_addr, "unknown", sizeof(ip_header_res->reply_dst_addr) - 1);
+            ip_header_res->reply_dst_addr[sizeof(ip_header_res->reply_dst_addr) - 1] = '\0';
         }
     }
 
@@ -2493,9 +2493,9 @@ int decode_icmp_ipv6(
     *id = icp->icmp6_id;
     *seq = ntohs(icp->icmp6_seq);
 
-    if (opt_print_srcaddr_on) {
-        strncpy(ip_header_res->src_addr, "not supported", sizeof(ip_header_res->src_addr) - 1);
-        ip_header_res->src_addr[sizeof(ip_header_res->src_addr) - 1] = '\0';
+    if (opt_print_reply_dst_on) {
+        strncpy(ip_header_res->reply_dst_addr, "not supported", sizeof(ip_header_res->reply_dst_addr) - 1);
+        ip_header_res->reply_dst_addr[sizeof(ip_header_res->reply_dst_addr) - 1] = '\0';
     }
 
     return 1;
@@ -3165,6 +3165,6 @@ void usage(int is_error)
     fprintf(out, "   -X, --fast-reachable=N exits true immediately when N hosts are found\n");
     fprintf(out, "       --print-tos    show received TOS value\n");
     fprintf(out, "       --print-ttl    show IP TTL value\n");
-    fprintf(out, "       --print-srcaddr show used IP source address (IPv6 is currently not supported).\n");
+    fprintf(out, "       --print-reply-dst show the destination address of the received reply packet (IPv6 is currently not supported).\n");
     exit(is_error);
 }
index ef2ca79d1e31eb3f907b6b43dbf21090ee6be20f..f80f25e7e0fc2e4456878d8e4ef1e8e8ec619982 100644 (file)
@@ -18,7 +18,7 @@ typedef struct ip_header_result {
     uint32_t otime_ms;
     uint32_t rtime_ms;
     uint32_t ttime_ms;
-    char src_addr[INET6_ADDRSTRLEN];
+    char reply_dst_addr[INET6_ADDRSTRLEN];
 } IP_HEADER_RESULT;
 
 typedef struct host_entry {
index 2ce3047fec19ab2aadec1a3cb43776fa5dea6213..777da4c5e8fa1cdc8dad4f510daa5310d8c7b0ba 100644 (file)
@@ -233,8 +233,8 @@ void print_recv_ext(IP_HEADER_RESULT *ip_header_res, int64_t recv_time, int64_t
             ms_since_midnight_utc(recv_time));
     }
 
-    if (ip_header_res->src_addr[0]) {
-        printf(" (SRC %s)", ip_header_res->src_addr);
+    if (ip_header_res->reply_dst_addr[0]) {
+        printf(" (Reply-DST %s)", ip_header_res->reply_dst_addr);
     }
 
 #if defined(HAVE_IP_RECVTOS)
@@ -285,8 +285,8 @@ void print_recv_ext_json(IP_HEADER_RESULT *ip_header_res, int64_t recv_time, int
         printf("\"localreceive\": %u}", ms_since_midnight_utc(recv_time));
     }
 
-    if (ip_header_res->src_addr[0]) {
-        printf(", \"src\": \"%s\"", ip_header_res->src_addr);
+    if (ip_header_res->reply_dst_addr[0]) {
+        printf(", \"replyDst\": \"%s\"", ip_header_res->reply_dst_addr);
     }
 
 #if defined(HAVE_IP_RECVTOS)