signals: New function signal_name().
authorBen Pfaff <blp@nicira.com>
Fri, 1 Apr 2011 17:22:51 +0000 (10:22 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 4 Apr 2011 17:58:55 +0000 (10:58 -0700)
This will acquire a new user in an upcoming commit.

lib/process.c
lib/signals.c
lib/signals.h

index 8263437c136ce2c86d94937ae96cd6a006f24791..f772833d818ba694812d5e55fd8ed25c15893af7 100644 (file)
@@ -30,6 +30,7 @@
 #include "fatal-signal.h"
 #include "list.h"
 #include "poll-loop.h"
+#include "signals.h"
 #include "socket-util.h"
 #include "util.h"
 #include "vlog.h"
@@ -353,17 +354,10 @@ process_status_msg(int status)
     struct ds ds = DS_EMPTY_INITIALIZER;
     if (WIFEXITED(status)) {
         ds_put_format(&ds, "exit status %d", WEXITSTATUS(status));
-    } else if (WIFSIGNALED(status) || WIFSTOPPED(status)) {
-        int signr = WIFSIGNALED(status) ? WTERMSIG(status) : WSTOPSIG(status);
-        const char *name = NULL;
-#ifdef HAVE_STRSIGNAL
-        name = strsignal(signr);
-#endif
-        ds_put_format(&ds, "%s by signal %d",
-                      WIFSIGNALED(status) ? "killed" : "stopped", signr);
-        if (name) {
-            ds_put_format(&ds, " (%s)", name);
-        }
+    } else if (WIFSIGNALED(status)) {
+        ds_put_format(&ds, "killed (%s)", signal_name(WTERMSIG(status)));
+    } else if (WIFSTOPPED(status)) {
+        ds_put_format(&ds, "stopped (%s)", signal_name(WSTOPSIG(status)));
     } else {
         ds_put_format(&ds, "terminated abnormally (%x)", status);
     }
index eabbcc382c03c28a1dbc78a1e8cb0180955e3a24..707bf836870c9c6a98cbb8a5e868d071f4cd7676 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2011 Nicira Networks.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
 #include <unistd.h>
 #include "poll-loop.h"
 #include "socket-util.h"
+#include "type-props.h"
 #include "util.h"
 
 #if defined(_NSIG)
@@ -126,3 +127,24 @@ signal_handler(int signr)
         signaled[signr] = true;
     }
 }
+
+/* Returns the name of signal 'signum' as a string.  The string may be in a
+ * static buffer that is reused from one call to the next.
+ *
+ * The string is probably a (possibly multi-word) description of the signal
+ * (e.g. "Hangup") instead of just the stringified version of the macro
+ * (e.g. "SIGHUP"). */
+const char *
+signal_name(int signum)
+{
+    const char *name = NULL;
+#ifdef HAVE_STRSIGNAL
+    name = strsignal(signum);
+#endif
+    if (!name) {
+        static char buffer[7 + INT_STRLEN(int) + 1];
+        sprintf(buffer, "signal %d", signum);
+        name = buffer;
+    }
+    return name;
+}
index 847e58b11eb88b50083205b984825bff291f9d0c..41066c40c3880471801eb0b1eee4ad39a81f5a06 100644 (file)
@@ -24,4 +24,6 @@ struct signal *signal_register(int signr);
 bool signal_poll(struct signal *);
 void signal_wait(struct signal *);
 
+const char *signal_name(int signum);
+
 #endif /* signals.h */