]> git.gsnw.org Git - fping.git/commitdiff
implement finish handler through flag instead of direct call in signal handler
authorDavid van Leusen <jvleusen@gmail.com>
Mon, 27 Jul 2020 13:39:53 +0000 (15:39 +0200)
committerDavid van Leusen <jvleusen@gmail.com>
Mon, 27 Jul 2020 13:39:53 +0000 (15:39 +0200)
src/fping.c

index 565ac0115477e6702ea4c9564a16352c32efe2e9..327266abb58efdbac418a1bfb72eb974d97cf239 100644 (file)
@@ -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;
+    }
 }