[ovs-dev] [branch-1.1 02/34] signals: New function signal_name().

Ben Pfaff blp at nicira.com
Fri Apr 29 21:56:33 UTC 2011


This will acquire a new user in an upcoming commit.
---
 lib/process.c |   16 +++++-----------
 lib/signals.c |   24 +++++++++++++++++++++++-
 lib/signals.h |    2 ++
 3 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/lib/process.c b/lib/process.c
index 8263437..f772833 100644
--- a/lib/process.c
+++ b/lib/process.c
@@ -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);
     }
diff --git a/lib/signals.c b/lib/signals.c
index eabbcc3..707bf83 100644
--- a/lib/signals.c
+++ b/lib/signals.c
@@ -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;
+}
diff --git a/lib/signals.h b/lib/signals.h
index 847e58b..41066c4 100644
--- a/lib/signals.h
+++ b/lib/signals.h
@@ -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 */
-- 
1.7.4.4




More information about the dev mailing list