summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/kmsg-syslogd.c2
-rw-r--r--src/manager.c6
-rw-r--r--src/util.c41
-rw-r--r--src/util.h8
4 files changed, 48 insertions, 9 deletions
diff --git a/src/kmsg-syslogd.c b/src/kmsg-syslogd.c
index 83c2047a7a..0901a0e49b 100644
--- a/src/kmsg-syslogd.c
+++ b/src/kmsg-syslogd.c
@@ -379,7 +379,7 @@ static int process_event(Server *s, struct epoll_event *ev) {
return -errno;
}
- log_debug("Received SIG%s", strna(signal_to_string(sfsi.ssi_signo)));
+ log_debug("Received SIG%s", signal_to_string(sfsi.ssi_signo));
return 0;
} else {
diff --git a/src/manager.c b/src/manager.c
index cf308ac4d3..7ce1b3bab3 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -2111,11 +2111,11 @@ static int manager_process_signal_fd(Manager *m) {
get_process_name(sfsi.ssi_pid, &p);
log_debug("Received SIG%s from PID %lu (%s).",
- strna(signal_to_string(sfsi.ssi_signo)),
+ signal_to_string(sfsi.ssi_signo),
(unsigned long) sfsi.ssi_pid, strna(p));
free(p);
} else
- log_debug("Received SIG%s.", strna(signal_to_string(sfsi.ssi_signo)));
+ log_debug("Received SIG%s.", signal_to_string(sfsi.ssi_signo));
switch (sfsi.ssi_signo) {
@@ -2283,7 +2283,7 @@ static int manager_process_signal_fd(Manager *m) {
break;
default:
- log_warning("Got unhandled signal <%s>.", strna(signal_to_string(sfsi.ssi_signo)));
+ log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo));
}
}
}
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;
diff --git a/src/util.h b/src/util.h
index 3e1f46d826..e254bc7884 100644
--- a/src/util.h
+++ b/src/util.h
@@ -288,13 +288,13 @@ int make_null_stdio(void);
unsigned long long random_ull(void);
-#define DEFINE_STRING_TABLE_LOOKUP(name,type) \
- const char *name##_to_string(type i) { \
+#define __DEFINE_STRING_TABLE_LOOKUP(name,type,scope) \
+ scope const char *name##_to_string(type i) { \
if (i < 0 || i >= (type) ELEMENTSOF(name##_table)) \
return NULL; \
return name##_table[i]; \
} \
- type name##_from_string(const char *s) { \
+ scope type name##_from_string(const char *s) { \
type i; \
unsigned u = 0; \
assert(s); \
@@ -309,6 +309,8 @@ unsigned long long random_ull(void);
} \
struct __useless_struct_to_allow_trailing_semicolon__
+#define DEFINE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,)
+#define DEFINE_PRIVATE_STRING_TABLE_LOOKUP(name,type) __DEFINE_STRING_TABLE_LOOKUP(name,type,static)
int fd_nonblock(int fd, bool nonblock);
int fd_cloexec(int fd, bool cloexec);