diff --git a/src/fping.c b/src/fping.c index f4d0d84..6a57be4 100644 --- a/src/fping.c +++ b/src/fping.c @@ -307,16 +307,16 @@ volatile sig_atomic_t finish_requested = 0; unsigned int debugging = 0; -/* times get *100 because all times are calculated in 10 usec units, not ms */ +/* all time-related values are int64_t nanoseconds */ unsigned int retry = DEFAULT_RETRY; -unsigned int timeout = DEFAULT_TIMEOUT * 100; -unsigned int interval = DEFAULT_INTERVAL * 100; -unsigned int perhost_interval = DEFAULT_PERHOST_INTERVAL * 100; +int64_t timeout = (int64_t) DEFAULT_TIMEOUT * 1000000; +int64_t interval = (int64_t) DEFAULT_INTERVAL * 1000000; +int64_t perhost_interval = (int64_t) DEFAULT_PERHOST_INTERVAL * 1000000; float backoff = DEFAULT_BACKOFF_FACTOR; unsigned int ping_data_size = DEFAULT_PING_DATA_SIZE; unsigned int count = 1, min_reachable = 0; unsigned int trials; -unsigned int report_interval = 0; +int64_t report_interval = 0; unsigned int ttl = 0; int src_addr_set = 0; struct in_addr src_addr; @@ -557,7 +557,7 @@ int main(int argc, char** argv) if (opt_value_float < 0) { usage(1); } - timeout = opt_value_float * 100; + timeout = opt_value_float * 1000000; timeout_flag = 1; break; @@ -572,7 +572,7 @@ int main(int argc, char** argv) if (opt_value_float < 0) { usage(1); } - interval = opt_value_float * 100; + interval = opt_value_float * 1000000; break; case 'p': @@ -581,7 +581,7 @@ int main(int argc, char** argv) if (opt_value_float < 0) { usage(1); } - perhost_interval = opt_value_float * 100; + perhost_interval = opt_value_float * 1000000; break; @@ -623,7 +623,7 @@ int main(int argc, char** argv) if (opt_value_float < 0) { usage(1); } - report_interval = opt_value_float * 100000; + report_interval = opt_value_float * 1e9; break; @@ -822,7 +822,7 @@ int main(int argc, char** argv) } #ifdef FPING_SAFE_LIMITS - if ((interval < MIN_INTERVAL * 100 || perhost_interval < MIN_PERHOST_INTERVAL * 100) + if ((interval < (int64_t) MIN_INTERVAL * 1000000 || perhost_interval < (int64_t) MIN_PERHOST_INTERVAL * 1000000) && getuid()) { fprintf(stderr, "%s: these options are too risky for mere mortals.\n", prog); fprintf(stderr, "%s: You need -i >= %u and -p >= %u\n", @@ -867,8 +867,8 @@ int main(int argc, char** argv) if (loop_flag || count_flag) { if (!timeout_flag) { timeout = perhost_interval; - if (timeout > AUTOTUNE_TIMEOUT_MAX * 100) { - timeout = AUTOTUNE_TIMEOUT_MAX * 100; + if (timeout > (int64_t) AUTOTUNE_TIMEOUT_MAX * 1000000) { + timeout = (int64_t) AUTOTUNE_TIMEOUT_MAX * 1000000; } } } @@ -894,10 +894,10 @@ int main(int argc, char** argv) report_all_rtts_flag = 1; if (trace_flag) { - fprintf(stderr, "%s:\n count: %u, retry: %u, interval: %u\n", - prog, count, retry, interval / 10); - fprintf(stderr, " perhost_interval: %u, timeout: %u\n", - perhost_interval / 10, timeout / 10); + fprintf(stderr, "%s:\n count: %u, retry: %u, interval: %.0f ms\n", + prog, count, retry, interval / 1e6); + fprintf(stderr, " perhost_interval: %.0f ms, timeout: %.0f\n", + perhost_interval / 1e6, timeout / 1e6); fprintf(stderr, " ping_data_size = %u, trials = %u\n", ping_data_size, trials); @@ -1107,7 +1107,7 @@ int main(int argc, char** argv) setlinebuf(stdout); if (report_interval) { - next_report_time = current_time_ns + (int64_t)report_interval*10000; + next_report_time = current_time_ns + report_interval; } last_send_time = 0; @@ -1317,7 +1317,7 @@ void main_loop() { /* Make sure that we don't ping more than once every "interval" */ lt = current_time_ns - last_send_time; - if (lt < interval*10000) + if (lt < interval) goto wait_for_reply; /* Dequeue the event */ @@ -1331,7 +1331,7 @@ void main_loop() /* Loop and count mode: schedule next ping */ if (loop_flag || (count_flag && event->ping_index+1 < count)) { - host_add_ping_event(h, event->ping_index+1, event->ev_time + (int64_t)perhost_interval*10000); + host_add_ping_event(h, event->ping_index+1, event->ev_time + perhost_interval); } } @@ -1345,14 +1345,14 @@ void main_loop() wait_time_ns = 0; /* make sure that we wait enough, so that the inter-ping delay is * bigger than 'interval' */ - if (wait_time_ns < interval*10000) { + if (wait_time_ns < interval) { lt = current_time_ns - last_send_time; - if (lt < interval*10000) { - wait_time_ns = interval*10000 - lt; + if (lt < interval) { + wait_time_ns = interval - lt; } } - dbg_printf("next ping event in %ld ms (%s)\n", wait_time_ns / 1000000, event_queue_ping.first->host->host); + dbg_printf("next ping event in %.0f ms (%s)\n", wait_time_ns / 1e6, event_queue_ping.first->host->host); } /* When is the next timeout event? */ @@ -1365,7 +1365,7 @@ void main_loop() } } - dbg_printf("next timeout event in %ld ms (%s)\n", wait_time_timeout / 1000000, event_queue_timeout.first->host->host); + dbg_printf("next timeout event in %.0f ms (%s)\n", wait_time_timeout / 1e6, event_queue_timeout.first->host->host); } /* When is the next report due? */ @@ -1378,7 +1378,7 @@ void main_loop() } } - dbg_printf("next report event in %ld ms\n", wait_time_next_report / 1000000); + dbg_printf("next report event in %0.f ms\n", wait_time_next_report / 1e6); } /* if wait_time is still -1, it means that we are waiting for nothing... */ @@ -1393,7 +1393,7 @@ void main_loop() /* Receive replies */ /* (this is what sleeps during each loop iteration) */ - dbg_printf("waiting up to %ld ms\n", wait_time_ns / 1000000); + dbg_printf("waiting up to %.0f ms\n", wait_time_ns / 1e6); if (wait_for_reply(wait_time_ns)) { while (wait_for_reply(0)) ; /* process other replies in the queue */ @@ -1414,7 +1414,7 @@ void main_loop() print_per_system_splits(); while (current_time_ns >= next_report_time) { - next_report_time += (int64_t)report_interval*10000; + next_report_time += report_interval; } } } @@ -1572,7 +1572,7 @@ void print_per_system_stats(void) if (outage_flag) { /* Time outage total */ - outage_ms = (h->num_sent - h->num_recv) * perhost_interval / 100; + outage_ms = (h->num_sent - h->num_recv) * perhost_interval / 1e6; fprintf(stderr, ", outage(ms) = %d", outage_ms); } } @@ -1619,7 +1619,7 @@ void print_netdata(void) h = table[i]; if (!sent_charts) { - printf("CHART fping.%s_packets '' 'FPing Packets for host %s' packets '%s' fping.packets line 110020 %d\n", h->name, h->host, h->name, report_interval / 100000); + printf("CHART fping.%s_packets '' 'FPing Packets for host %s' packets '%s' fping.packets line 110020 %.0f\n", h->name, h->host, h->name, report_interval / 1e9); printf("DIMENSION xmt sent absolute 1 1\n"); printf("DIMENSION rcv received absolute 1 1\n"); } @@ -1630,7 +1630,7 @@ void print_netdata(void) printf("END\n"); if (!sent_charts) { - printf("CHART fping.%s_quality '' 'FPing Quality for host %s' percentage '%s' fping.quality area 110010 %d\n", h->name, h->host, h->name, report_interval / 100000); + printf("CHART fping.%s_quality '' 'FPing Quality for host %s' percentage '%s' fping.quality area 110010 %.0f\n", h->name, h->host, h->name, report_interval / 1e9); printf("DIMENSION returned '' absolute 1 1\n"); /* printf("DIMENSION lost '' absolute 1 1\n"); */ } @@ -1647,7 +1647,7 @@ void print_netdata(void) printf("END\n"); if (!sent_charts) { - printf("CHART fping.%s_latency '' 'FPing Latency for host %s' ms '%s' fping.latency area 110000 %d\n", h->name, h->host, h->name, report_interval / 100000); + printf("CHART fping.%s_latency '' 'FPing Latency for host %s' ms '%s' fping.latency area 110000 %.0f\n", h->name, h->host, h->name, report_interval / 1e9); printf("DIMENSION min minimum absolute 1 1000000\n"); printf("DIMENSION max maximum absolute 1 1000000\n"); printf("DIMENSION avg average absolute 1 1000000\n"); @@ -1705,7 +1705,7 @@ void print_per_system_splits(void) if (outage_flag) { /* Time outage */ - outage_ms_i = (h->num_sent_i - h->num_recv_i) * perhost_interval / 100; + outage_ms_i = (h->num_sent_i - h->num_recv_i) * perhost_interval / 1e6; fprintf(stderr, ", outage(ms) = %d", outage_ms_i); } } @@ -1834,7 +1834,7 @@ int send_ping(HOST_ENTRY* h, int index) } else { /* schedule timeout */ - host_add_timeout_event(h, index, current_time_ns + (int64_t)h->timeout*10000); + host_add_timeout_event(h, index, current_time_ns + h->timeout); /* mark this trial as outstanding */ if (!loop_flag) { @@ -2336,7 +2336,7 @@ int wait_for_reply(int64_t wait_time) /* discard reply if delay is larger than timeout * (see also: github #32) */ - if (this_reply > (int64_t)(h->timeout)*10000) { + if (this_reply > h->timeout) { return 1; } @@ -2718,8 +2718,8 @@ void host_add_ping_event(HOST_ENTRY *h, int index, int64_t ev_time) event->ev_time = ev_time; ev_enqueue(&event_queue_ping, event); - dbg_printf("%s [%d]: add ping event in %ld ms\n", - event->host->host, index, (ev_time - current_time_ns) / 1000000); + dbg_printf("%s [%d]: add ping event in %.0f ms\n", + event->host->host, index, (ev_time - current_time_ns) / 1e6); } void host_add_timeout_event(HOST_ENTRY *h, int index, int64_t ev_time) @@ -2730,8 +2730,8 @@ void host_add_timeout_event(HOST_ENTRY *h, int index, int64_t ev_time) event->ev_time = ev_time; ev_enqueue(&event_queue_timeout, event); - dbg_printf("%s [%d]: add timeout event in %ld ms\n", - event->host->host, index, (ev_time - current_time_ns) / 1000000); + dbg_printf("%s [%d]: add timeout event in %.0f ms\n", + event->host->host, index, (ev_time - current_time_ns) / 1e6); } struct event *host_get_timeout_event(HOST_ENTRY *h, int index) @@ -2874,11 +2874,11 @@ void usage(int is_error) fprintf(out, " -M, --dontfrag set the Don't Fragment flag\n"); fprintf(out, " -O, --tos=N set the type of service (tos) flag on the ICMP packets\n"); fprintf(out, " -p, --period=MSEC interval between ping packets to one target (in ms)\n"); - fprintf(out, " (in loop and count modes, default: %d ms)\n", perhost_interval / 100); + fprintf(out, " (in loop and count modes, default: %.0f ms)\n", perhost_interval / 1e6); fprintf(out, " -r, --retry=N number of retries (default: %d)\n", DEFAULT_RETRY); fprintf(out, " -R, --random random packet data (to foil link data compression)\n"); fprintf(out, " -S, --src=IP set source address\n"); - fprintf(out, " -t, --timeout=MSEC individual target initial timeout (default: %d ms,\n", timeout/100); + fprintf(out, " -t, --timeout=MSEC individual target initial timeout (default: %.0f ms,\n", timeout / 1e6); fprintf(out, " except with -l/-c/-C, where it's the -p period up to 2000 ms)\n"); fprintf(out, "\n"); fprintf(out, "Output options:\n"); @@ -2887,7 +2887,7 @@ void usage(int is_error) fprintf(out, " -C, --vcount=N same as -c, report results in verbose format\n"); fprintf(out, " -D, --timestamp print timestamp before each output line\n"); fprintf(out, " -e, --elapsed show elapsed time on return packets\n"); - fprintf(out, " -i, --interval=MSEC interval between sending ping packets (default: %d ms)\n", interval / 100); + fprintf(out, " -i, --interval=MSEC interval between sending ping packets (default: %.0f ms)\n", interval / 1e6); fprintf(out, " -n, --name show targets by name (-d is equivalent)\n"); fprintf(out, " -N, --netdata output compatible for netdata (-l -Q are required)\n"); fprintf(out, " -o, --outage show the accumulated outage time (lost packets * packet interval)\n");