signals: Use sys_siglist[] instead of strsignal() for thread-safety.
authorBen Pfaff <blp@nicira.com>
Fri, 5 Apr 2013 04:29:59 +0000 (23:29 -0500)
committerBen Pfaff <blp@nicira.com>
Wed, 5 Jun 2013 19:46:58 +0000 (12:46 -0700)
strsignal() isn't thread-safe but sys_siglist[] is.  Also, according to
the glibc manual, BSD has sys_siglist[] but not strsignal().

Signed-off-by: Ben Pfaff <blp@nicira.com>
configure.ac
lib/signals.c

index 91f3835..a691963 100644 (file)
@@ -59,10 +59,11 @@ OVS_CHECK_DOT
 OVS_CHECK_IF_PACKET
 OVS_CHECK_IF_DL
 OVS_CHECK_STRTOK_R
+AC_CHECK_DECLS([sys_siglist], [], [], [[#include <signal.h>]])
 AC_CHECK_MEMBERS([struct stat.st_mtim.tv_nsec, struct stat.st_mtimensec],
   [], [], [[#include <sys/stat.h>]])
 AC_CHECK_MEMBERS([struct ifreq.ifr_flagshigh], [], [], [[#include <net/if.h>]])
-AC_CHECK_FUNCS([mlockall strnlen strsignal getloadavg statvfs getmntent_r])
+AC_CHECK_FUNCS([mlockall strnlen getloadavg statvfs getmntent_r])
 AC_CHECK_HEADERS([mntent.h sys/statvfs.h linux/types.h linux/if_ether.h])
 AC_CHECK_HEADERS([net/if_mib.h], [], [], [[#include <sys/types.h>
 #include <net/if.h>]])
index f31bc52..c47fefa 100644 (file)
@@ -147,9 +147,13 @@ const char *
 signal_name(int signum)
 {
     const char *name = NULL;
-#ifdef HAVE_STRSIGNAL
-    name = strsignal(signum);
+
+#if HAVE_DECL_SYS_SIGLIST
+    if (signum >= 0 && signum < ARRAY_SIZE(sys_siglist)) {
+        name = sys_siglist[signum];
+    }
 #endif
+
     if (!name) {
         static char buffer[7 + INT_STRLEN(int) + 1];
         sprintf(buffer, "signal %d", signum);