util: Implement utilSigName()

This commit is contained in:
Robert Swiecki 2017-06-20 00:16:38 +02:00
parent 40a472a77e
commit fa2796fe65
5 changed files with 30 additions and 23 deletions

View File

@ -136,7 +136,7 @@ indent:
# DO NOT DELETE THIS LINE -- make depend depends on it. # DO NOT DELETE THIS LINE -- make depend depends on it.
nsjail.o: nsjail.h common.h cmdline.h log.h net.h subproc.h nsjail.o: nsjail.h common.h cmdline.h log.h net.h subproc.h util.h
cmdline.o: cmdline.h common.h config.h log.h mount.h util.h user.h cmdline.o: cmdline.h common.h config.h log.h mount.h util.h user.h
config.o: common.h config.h log.h mount.h user.h util.h config.o: common.h config.h log.h mount.h user.h util.h
contain.o: contain.h common.h cgroup.h cpu.h log.h mount.h net.h pid.h user.h contain.o: contain.h common.h cgroup.h cpu.h log.h mount.h net.h pid.h user.h

View File

@ -34,6 +34,7 @@
#include "log.h" #include "log.h"
#include "net.h" #include "net.h"
#include "subproc.h" #include "subproc.h"
#include "util.h"
static __thread int nsjailSigFatal = 0; static __thread int nsjailSigFatal = 0;
static __thread bool nsjailShowProc = false; static __thread bool nsjailShowProc = false;
@ -55,7 +56,7 @@ static void nsjailSig(int sig)
static bool nsjailSetSigHandler(int sig) static bool nsjailSetSigHandler(int sig)
{ {
LOG_D("Setting sighandler for signal '%d' (%s)", sig, strsignal(sig)); LOG_D("Setting sighandler for signal %s (%d)", utilSigName(sig), sig);
sigset_t smask; sigset_t smask;
sigemptyset(&smask); sigemptyset(&smask);

View File

@ -58,21 +58,6 @@ static const char subprocDoneChar = 'D';
#define CLONE_NEWCGROUP 0x02000000 #define CLONE_NEWCGROUP 0x02000000
#endif /* !defined(CLONE_NEWCGROUP) */ #endif /* !defined(CLONE_NEWCGROUP) */
extern const char *sys_sigabbrev[];
static const char *subprocSigName(int signo)
{
static __thread char sigName[1024];
if (signo >= __SIGRTMIN && signo <= SIGRTMAX) {
snprintf(sigName, sizeof(sigName), "SIG%d=__RTMIN+%d", signo, signo - __SIGRTMIN);
} else if (signo >= 0 && signo <= SIGSYS) {
snprintf(sigName, sizeof(sigName), "SIG%s", sys_sigabbrev[signo]);
} else {
snprintf(sigName, sizeof(sigName), "UNKNOWN-%d", signo);
}
return sigName;
}
static const char *subprocCloneFlagsToStr(uintptr_t flags) static const char *subprocCloneFlagsToStr(uintptr_t flags)
{ {
static __thread char cloneFlagName[1024]; static __thread char cloneFlagName[1024];
@ -124,7 +109,7 @@ static const char *subprocCloneFlagsToStr(uintptr_t flags)
utilSSnPrintf(cloneFlagName, sizeof(cloneFlagName), "%#tx|", utilSSnPrintf(cloneFlagName, sizeof(cloneFlagName), "%#tx|",
flags & ~(knownFlagMask)); flags & ~(knownFlagMask));
} }
utilSSnPrintf(cloneFlagName, sizeof(cloneFlagName), "%s", subprocSigName(flags & CSIGNAL)); utilSSnPrintf(cloneFlagName, sizeof(cloneFlagName), "%s", utilSigName(flags & CSIGNAL));
return cloneFlagName; return cloneFlagName;
} }
@ -321,9 +306,10 @@ int subprocReap(struct nsjconf_t *nsjconf)
} }
} }
if (WIFSIGNALED(status)) { if (WIFSIGNALED(status)) {
LOG_I("PID: %d (%s) terminated with signal: %d, (PIDs left: %d)", LOG_I
si.si_pid, remote_txt, WTERMSIG(status), ("PID: %d (%s) terminated with signal: %s (%d), (PIDs left: %d)",
subprocCount(nsjconf) - 1); si.si_pid, remote_txt, utilSigName(WTERMSIG(status)),
WTERMSIG(status), subprocCount(nsjconf) - 1);
subprocRemove(nsjconf, si.si_pid); subprocRemove(nsjconf, si.si_pid);
rv = 100 + WTERMSIG(status); rv = 100 + WTERMSIG(status);
} }
@ -538,8 +524,8 @@ int subprocSystem(const char **argv, char **env)
} }
if (WIFSIGNALED(status)) { if (WIFSIGNALED(status)) {
int exit_signal = WTERMSIG(status); int exit_signal = WTERMSIG(status);
LOG_W("PID %d killed by a signal: %d (%s)", pid, exit_signal, LOG_W("PID %d killed by signal: %d (%s)", pid, exit_signal,
strsignal(exit_signal)); utilSigName(exit_signal));
return 2; return 2;
} }
LOG_W("Unknown exit status: %d", status); LOG_W("Unknown exit status: %d", status);

19
util.c
View File

@ -25,6 +25,7 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <pthread.h> #include <pthread.h>
#include <signal.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -241,3 +242,21 @@ uint64_t utilRnd64(void)
rndX = a * rndX + c; rndX = a * rndX + c;
return rndX; return rndX;
} }
extern const char *sys_sigabbrev[];
static __thread char arch_signame[32];
const char *utilSigName(int signo)
{
if (signo < 0 || signo > _NSIG) {
snprintf(arch_signame, sizeof(arch_signame), "UNKNOWN-%d", signo);
return arch_signame;
}
if (signo > __SIGRTMIN) {
snprintf(arch_signame, sizeof(arch_signame), "SIG%d-RTMIN+%d", signo,
signo - __SIGRTMIN);
return arch_signame;
}
snprintf(arch_signame, sizeof(arch_signame), "SIG%s", sys_sigabbrev[signo]);
return arch_signame;
}

1
util.h
View File

@ -40,5 +40,6 @@ bool utilCreateDirRecursively(const char *dir);
int utilSSnPrintf(char *str, size_t size, const char *format, ...); int utilSSnPrintf(char *str, size_t size, const char *format, ...);
bool utilIsANumber(const char *s); bool utilIsANumber(const char *s);
uint64_t utilRnd64(void); uint64_t utilRnd64(void);
const char *utilSigName(int signo);
#endif /* NS_UTIL_H */ #endif /* NS_UTIL_H */