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.
This commit is contained in:
Michal Schmidt 2011-09-23 09:39:40 +02:00
parent 764e9b5f07
commit 4e240ab0c9
4 changed files with 48 additions and 9 deletions

View File

@ -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 {

View File

@ -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));
}
}
}

View File

@ -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;

View File

@ -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);