From 83ddfb6b48053f0fe202e5f7934e60b81720952b Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 1 Apr 2011 10:22:51 -0700 Subject: [PATCH] signals: New function signal_name(). 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 8263437c1..f772833d8 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 eabbcc382..707bf8368 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 #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 847e58b11..41066c40c 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 */ -- 2.43.0