summaryrefslogtreecommitdiff
path: root/src/util.c
diff options
context:
space:
mode:
authorMichal Schmidt <mschmidt@redhat.com>2011-09-23 09:39:40 +0200
committerMichal Schmidt <mschmidt@redhat.com>2011-09-23 10:30:19 +0200
commit4e240ab0c93f4d454b065eef7074132969ac6f16 (patch)
tree9b25619b52b70a6ac2c78b34aaeda998fe36deb7 /src/util.c
parent764e9b5f073e1d5216de150045ec85475835fe3c (diff)
util: improve signal_to_string, signal_from_string
signal_to_string: Produce names for SIGRTMIN+n. Never give an "n/a" result. In the worst case give the number itself as a string. signal_from_string: Parse "RTMIN+n". Parse any valid signal number.
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c41
1 files changed, 39 insertions, 2 deletions
diff --git a/src/util.c b/src/util.c
index 2eb6ba74fc..36c8938c2f 100644
--- a/src/util.c
+++ b/src/util.c
@@ -5814,7 +5814,7 @@ static const char* const ip_tos_table[] = {
DEFINE_STRING_TABLE_LOOKUP(ip_tos, int);
-static const char *const signal_table[] = {
+static const char *const __signal_table[] = {
[SIGHUP] = "HUP",
[SIGINT] = "INT",
[SIGQUIT] = "QUIT",
@@ -5850,7 +5850,44 @@ static const char *const signal_table[] = {
[SIGSYS] = "SYS"
};
-DEFINE_STRING_TABLE_LOOKUP(signal, int);
+DEFINE_PRIVATE_STRING_TABLE_LOOKUP(__signal, int);
+
+const char *signal_to_string(int signo) {
+ static __thread char buf[12];
+ const char *name;
+
+ name = __signal_to_string(signo);
+ if (name)
+ return name;
+
+ if (signo >= SIGRTMIN && signo <= SIGRTMAX)
+ snprintf(buf, sizeof(buf) - 1, "RTMIN+%d", signo - SIGRTMIN);
+ else
+ snprintf(buf, sizeof(buf) - 1, "%d", signo);
+ char_array_0(buf);
+ return buf;
+}
+
+int signal_from_string(const char *s) {
+ int signo;
+ int offset = 0;
+ unsigned u;
+
+ signo =__signal_from_string(s);
+ if (signo > 0)
+ return signo;
+
+ if (startswith(s, "RTMIN+")) {
+ s += 6;
+ offset = SIGRTMIN;
+ }
+ if (safe_atou(s, &u) >= 0) {
+ signo = (int) u + offset;
+ if (signo > 0 && signo < _NSIG)
+ return signo;
+ }
+ return -1;
+}
bool kexec_loaded(void) {
bool loaded = false;