]> git.gsnw.org Git - fping.git/commitdiff
use sigaction when possible
authorDavid van Leusen <jvleusen@gmail.com>
Mon, 27 Jul 2020 13:48:20 +0000 (15:48 +0200)
committerDavid van Leusen <jvleusen@gmail.com>
Mon, 27 Jul 2020 13:48:20 +0000 (15:48 +0200)
configure.ac
src/fping.c

index 764e9583abc78c9a6dbf1dbc20753123321bdacf..c7df87aa7a6a92c08f9f28111d429430b4b9712d 100644 (file)
@@ -73,6 +73,10 @@ AC_CHECK_FUNC(connect)
 if test $ac_cv_func_connect = no; then
     AC_CHECK_LIB(socket, connect)
 fi
+AC_CHECK_FUNC(sigaction)
+if test $ac_cv_func_sigaction = yes; then
+    AC_DEFINE([USE_SIGACTION],[1],[Define if sigaction is available.])
+fi
 
 AH_TOP([
 #ifndef CONFIG_H
index 327266abb58efdbac418a1bfb72eb974d97cf239..1efd4f8634afa40dddc1224699fa0dcbb380a5fd 100644 (file)
@@ -434,6 +434,9 @@ int main(int argc, char** argv)
     uid_t uid;
     int tos = 0;
     struct optparse optparse_state;
+#ifdef USE_SIGACTION
+    struct sigaction act;
+#endif
 
     /* pre-parse -h/--help, so that we also can output help information
      * without trying to open the socket, which might fail */
@@ -1111,8 +1114,20 @@ int main(int argc, char** argv)
     init_ping_buffer_ipv6(ping_data_size);
 #endif
 
+#ifdef USE_SIGACTION
+    memset(&act, 0, sizeof(act));
+    act.sa_handler = signal_handler;
+    sigemptyset(&act.sa_mask);
+    sigaddset(&act.sa_mask, SIGINT);
+    sigaddset(&act.sa_mask, SIGQUIT);
+    act.sa_flags = SA_RESTART;
+    if (sigaction(SIGQUIT, &act, NULL) || sigaction(SIGINT, &act, NULL)) {
+        crash_and_burn("failure to set signal handler");
+    }
+#else
     signal(SIGINT, signal_handler);
     signal(SIGQUIT, signal_handler);
+#endif
     setlinebuf(stdout);
 
     if (report_interval) {