From fa2796fe65be0ff4280b3400388b3edb021c576f Mon Sep 17 00:00:00 2001 From: Robert Swiecki Date: Tue, 20 Jun 2017 00:16:38 +0200 Subject: [PATCH] util: Implement utilSigName() --- Makefile | 2 +- nsjail.c | 3 ++- subproc.c | 28 +++++++--------------------- util.c | 19 +++++++++++++++++++ util.h | 1 + 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 437e755..d9dfdc1 100644 --- a/Makefile +++ b/Makefile @@ -136,7 +136,7 @@ indent: # 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 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 diff --git a/nsjail.c b/nsjail.c index 29d21d8..4c683d4 100644 --- a/nsjail.c +++ b/nsjail.c @@ -34,6 +34,7 @@ #include "log.h" #include "net.h" #include "subproc.h" +#include "util.h" static __thread int nsjailSigFatal = 0; static __thread bool nsjailShowProc = false; @@ -55,7 +56,7 @@ static void nsjailSig(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; sigemptyset(&smask); diff --git a/subproc.c b/subproc.c index 5b031d2..b9bb9ce 100644 --- a/subproc.c +++ b/subproc.c @@ -58,21 +58,6 @@ static const char subprocDoneChar = 'D'; #define CLONE_NEWCGROUP 0x02000000 #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 __thread char cloneFlagName[1024]; @@ -124,7 +109,7 @@ static const char *subprocCloneFlagsToStr(uintptr_t flags) utilSSnPrintf(cloneFlagName, sizeof(cloneFlagName), "%#tx|", flags & ~(knownFlagMask)); } - utilSSnPrintf(cloneFlagName, sizeof(cloneFlagName), "%s", subprocSigName(flags & CSIGNAL)); + utilSSnPrintf(cloneFlagName, sizeof(cloneFlagName), "%s", utilSigName(flags & CSIGNAL)); return cloneFlagName; } @@ -321,9 +306,10 @@ int subprocReap(struct nsjconf_t *nsjconf) } } if (WIFSIGNALED(status)) { - LOG_I("PID: %d (%s) terminated with signal: %d, (PIDs left: %d)", - si.si_pid, remote_txt, WTERMSIG(status), - subprocCount(nsjconf) - 1); + LOG_I + ("PID: %d (%s) terminated with signal: %s (%d), (PIDs left: %d)", + si.si_pid, remote_txt, utilSigName(WTERMSIG(status)), + WTERMSIG(status), subprocCount(nsjconf) - 1); subprocRemove(nsjconf, si.si_pid); rv = 100 + WTERMSIG(status); } @@ -538,8 +524,8 @@ int subprocSystem(const char **argv, char **env) } if (WIFSIGNALED(status)) { int exit_signal = WTERMSIG(status); - LOG_W("PID %d killed by a signal: %d (%s)", pid, exit_signal, - strsignal(exit_signal)); + LOG_W("PID %d killed by signal: %d (%s)", pid, exit_signal, + utilSigName(exit_signal)); return 2; } LOG_W("Unknown exit status: %d", status); diff --git a/util.c b/util.c index 37b9e86..1aba2fd 100644 --- a/util.c +++ b/util.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -241,3 +242,21 @@ uint64_t utilRnd64(void) rndX = a * rndX + c; 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; +} diff --git a/util.h b/util.h index e65ab40..221f507 100644 --- a/util.h +++ b/util.h @@ -40,5 +40,6 @@ bool utilCreateDirRecursively(const char *dir); int utilSSnPrintf(char *str, size_t size, const char *format, ...); bool utilIsANumber(const char *s); uint64_t utilRnd64(void); +const char *utilSigName(int signo); #endif /* NS_UTIL_H */