- Move printing functions, stats functions (global stats) and
function declarations to a separate file (#454, thanks @gsnw-sebast)
- Avoid crash with option `-0` (#457, thanks @auerswal)
+- Move option parsing to a separate file fping.c and fping.h (#458, thanks @gsnw-sebast)
fping 5.5 (2025-12-31)
======================
sbin_PROGRAMS = fping
-fping_SOURCES = fping.c output.c stats.c seqmap.c socket4.c fping.h options.h output.h stats.h seqmap.h optparse.c optparse.h
+fping_SOURCES = fping.c flags.c output.c stats.c seqmap.c socket4.c fping.h flags.h options.h output.h stats.h seqmap.h optparse.c optparse.h
fping_DEPENDENCIES = ../config.h
if IPV6
--- /dev/null
+#include "flags.h"
+#include "options.h"
+
+#include <stdint.h>
+
+/* options with values */
+/* all time-related values are int64_t nanoseconds */
+unsigned int opt_retry = DEFAULT_RETRY;
+int64_t opt_timeout = (int64_t)DEFAULT_TIMEOUT * 1000000;
+int64_t opt_seqmap_timeout = (int64_t)DEFAULT_SEQMAP_TIMEOUT * 1000000;
+int64_t opt_interval = (int64_t)DEFAULT_INTERVAL * 1000000;
+int64_t opt_perhost_interval = (int64_t)DEFAULT_PERHOST_INTERVAL * 1000000;
+float opt_backoff = DEFAULT_BACKOFF_FACTOR;
+unsigned int opt_ping_data_size = DEFAULT_PING_DATA_SIZE;
+unsigned int opt_count = 1;
+unsigned int opt_min_reachable = 0;
+unsigned int opt_ttl = 0;
+
+/* switches 0 = off 1 = on */
+int opt_version_on = 0;
+int opt_verbose_on = 0;
+int opt_unreachable_on = 0;
+int opt_alive_on = 0;
+int opt_quiet_on = 0;
+int opt_elapsed_on = 0;
+int opt_stats_on = 0;
+int opt_cumulative_stats_on = 0;
+int opt_generate_on = 0; /* flag for IP list generation */
+int opt_count_on = 0;
+int opt_loop_on = 0;
+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_per_recv_on = 0;
+int opt_report_all_rtts_on = 0;
+int opt_name_on = 0;
+int opt_addr_on = 0;
+int opt_rdns_on = 0;
+int opt_backoff_on = 0;
+int opt_multif_on = 0;
+int opt_timeout_on = 0;
+int opt_fast_reachable_on = 0;
+int opt_outage_on = 0;
+int opt_random_data_on = 0;
+int opt_check_source_on = 0;
+int opt_size_on = 0;
+int opt_timestamp_on = 0;
+int opt_timestamp_format = 0;
+int opt_icmp_request_typ = 0;
\ No newline at end of file
--- /dev/null
+#ifndef FLAGS_H
+#define FLAGS_H
+
+#include <stdint.h>
+
+/* sized so as to be like traditional ping */
+#define DEFAULT_PING_DATA_SIZE 56
+
+/* options with values */
+/* all time-related values are int64_t nanoseconds */
+extern unsigned int opt_retry;
+extern int64_t opt_timeout;
+extern int64_t opt_seqmap_timeout;
+extern int64_t opt_interval;
+extern int64_t opt_perhost_interval;
+extern float opt_backoff;
+extern unsigned int opt_ping_data_size;
+extern unsigned int opt_count;
+extern unsigned int opt_min_reachable;
+extern unsigned int opt_ttl;
+
+/* switches 0 = off 1 = on */
+extern int opt_print_json_on;
+extern int opt_version_on;
+extern int opt_verbose_on;
+extern int opt_unreachable_on;
+extern int opt_alive_on;
+extern int opt_quiet_on;
+extern int opt_elapsed_on;
+extern int opt_stats_on;
+extern int opt_cumulative_stats_on;
+extern int opt_generate_on;
+extern int opt_count_on;
+extern int opt_loop_on;
+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_per_recv_on;
+extern int opt_report_all_rtts_on;
+extern int opt_name_on;
+extern int opt_addr_on;
+extern int opt_rdns_on;
+extern int opt_backoff_on;
+extern int opt_multif_on;
+extern int opt_timeout_on;
+extern int opt_fast_reachable_on;
+extern int opt_outage_on;
+extern int opt_random_data_on;
+extern int opt_check_source_on;
+extern int opt_size_on;
+extern int opt_timestamp_on;
+extern int opt_timestamp_format;
+extern int opt_icmp_request_typ;
+
+#endif
\ No newline at end of file
#include "config.h"
#include "fping.h"
+#include "flags.h"
#include "options.h"
#include "optparse.h"
#define MAX_GENERATE 131072 /* maximum number of hosts that -g can generate */
#define MAX_TARGET_NAME_LEN 255 /* maximum target name length read from file */
-/* sized so as to be like traditional ping */
-#define DEFAULT_PING_DATA_SIZE 56
-
/* ICMP Timestamp has a fixed payload size of 12 bytes */
#define ICMP_TIMESTAMP_DATA_SIZE 12
unsigned int debugging = 0;
-/* all time-related values are int64_t nanoseconds */
-unsigned int opt_retry = DEFAULT_RETRY;
-int64_t opt_timeout = (int64_t)DEFAULT_TIMEOUT * 1000000;
-int64_t opt_seqmap_timeout = (int64_t)DEFAULT_SEQMAP_TIMEOUT * 1000000;
-int64_t opt_interval = (int64_t)DEFAULT_INTERVAL * 1000000;
-int64_t opt_perhost_interval = (int64_t)DEFAULT_PERHOST_INTERVAL * 1000000;
-float opt_backoff = DEFAULT_BACKOFF_FACTOR;
-unsigned int opt_ping_data_size = DEFAULT_PING_DATA_SIZE;
-unsigned int opt_count = 1, opt_min_reachable = 0;
-unsigned int opt_ttl = 0;
-
unsigned int trials;
int64_t report_interval = 0;
int src_addr_set = 0;
int64_t last_send_time; /* time last ping was sent */
int64_t next_report_time; /* time next -Q report is expected */
-/* switches */
-int opt_version_on = 0;
-
-int opt_verbose_on = 0,
- opt_unreachable_on = 0,
- opt_alive_on = 0,
- opt_quiet_on = 0,
- opt_elapsed_on = 0,
- opt_stats_on = 0,
- opt_cumulative_stats_on = 0;
-int opt_generate_on = 0, /* flag for IP list generation */
- opt_count_on = 0,
- opt_loop_on;
-int opt_print_netdata_on = 0,
- opt_print_json_on = 0,
- opt_print_tos_on = 0,
- opt_print_ttl_on = 0;
-int opt_per_recv_on = 0,
- opt_report_all_rtts_on = 0,
- opt_name_on = 0,
- opt_addr_on = 0,
- opt_rdns_on = 0;
-int opt_backoff_on = 0;
-int opt_multif_on = 0,
- opt_timeout_on = 0,
- opt_fast_reachable_on = 0;
-int opt_outage_on = 0,
- opt_random_data_on = 0,
- opt_check_source_on = 0,
- opt_size_on = 0;
-
-int opt_timestamp_on = 0,
- opt_timestamp_format = 0;
-
-int opt_icmp_request_typ = 0;
+
#if defined(DEBUG) || defined(_DEBUG)
int opt_debug_randomly_lose_on, opt_debug_trace_on, opt_debug_print_per_system_on;
int lose_factor;
extern int num_pingsent, num_pingreceived, num_othericmprcvd;
extern int64_t max_reply, min_reply, total_replies, sum_replies;
-// Options
-extern int opt_print_json_on;
-extern int opt_timestamp_on;
-extern int opt_timestamp_format;
-extern int opt_alive_on;
-extern int opt_quiet_on;
-extern int opt_per_recv_on;
-extern int opt_verbose_on;
-extern int opt_print_tos_on;
-extern int opt_print_ttl_on;
-extern int opt_elapsed_on;
-extern int opt_icmp_request_typ;
-extern int opt_report_all_rtts_on;
-extern int opt_outage_on;
-extern int opt_cumulative_stats_on;
-extern int opt_print_netdata_on;
-extern int opt_random_data_on;
-
/* this requires variadic macros, part of C99 */
#if (defined(DEBUG) || defined(_DEBUG))
#include "output.h"
#include "fping.h"
+#include "flags.h"
+
#include <stdio.h>
#include <time.h>
#include <inttypes.h>
#include "config.h"
#include "fping.h"
+#include "flags.h"
#include <fcntl.h>
#include <netdb.h>
#include "config.h"
#include "fping.h"
+#include "flags.h"
#include <fcntl.h>
#include <netdb.h>
#include "stats.h"
-#include "output.h"
#include "fping.h"
+#include "flags.h"
+#include "output.h"
+
#include <stdio.h>
#include <inttypes.h>