From: David van Leusen Date: Mon, 27 Jul 2020 13:39:53 +0000 (+0200) Subject: implement finish handler through flag instead of direct call in signal handler X-Git-Url: https://git.gsnw.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69f72770761d824373a4f33f55beb9e467966ef1;p=fping.git implement finish handler through flag instead of direct call in signal handler --- diff --git a/src/fping.c b/src/fping.c index 565ac01..327266a 100644 --- a/src/fping.c +++ b/src/fping.c @@ -304,6 +304,7 @@ int hints_ai_family = AF_UNSPEC; #endif volatile sig_atomic_t status_snapshot = 0; +volatile sig_atomic_t finish_requested = 0; unsigned int debugging = 0; @@ -383,7 +384,7 @@ void print_per_system_splits(void); void print_netdata(void); void print_global_stats(void); void main_loop(); -void sigstatus(); +void signal_handler(int); void finish(); const char* sprint_tm(int64_t t); void ev_enqueue(struct event_queue *queue, struct event *event); @@ -1110,8 +1111,8 @@ int main(int argc, char** argv) init_ping_buffer_ipv6(ping_data_size); #endif - signal(SIGINT, finish); - signal(SIGQUIT, sigstatus); + signal(SIGINT, signal_handler); + signal(SIGQUIT, signal_handler); setlinebuf(stdout); if (report_interval) { @@ -1375,6 +1376,11 @@ void main_loop() break; } + /* end of loop was requested by interrupt signal handler */ + if (finish_requested) { + break; + } + /* Receive replies */ /* (this is what sleeps during each loop iteration) */ dbg_printf("waiting up to %ld ms\n", wait_time/100); @@ -1405,21 +1411,30 @@ void main_loop() /************************************************************ - Function: sigstatus + Function: signal_handler ************************************************************* - Inputs: void (none) + Inputs: int signum Description: SIGQUIT signal handler - set flag and return + SIGINT signal handler - set flag and return ************************************************************/ -void sigstatus() +void signal_handler(int signum) { - status_snapshot = 1; + switch (signum) { + case SIGINT: + finish_requested = 1; + break; + + case SIGQUIT: + status_snapshot = 1; + break; + } }