util: Implement utilSigName()
authorRobert Swiecki <robert@swiecki.net>
Mon, 19 Jun 2017 22:16:38 +0000 (00:16 +0200)
committerRobert Swiecki <robert@swiecki.net>
Mon, 19 Jun 2017 22:16:38 +0000 (00:16 +0200)
Makefile
nsjail.c
subproc.c
util.c
util.h

index 437e75540e87bd4577381d67b1e728b2f09dd2ec..d9dfdc1b59a0c972f25f0b9294097f05f9967ebb 100644 (file)
--- 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
index 29d21d87821c9fd7229487d8a58bf65a8a78cc0a..4c683d43400dbf0faf1e1dfdbef90259829c70db 100644 (file)
--- 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);
index 5b031d20031a6c3cdc1be4fbd990af02e5618bb1..b9bb9ce22372728fbb2a2d11ef7a36c3ae6b38ee 100644 (file)
--- 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 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 37b9e862d7d88039db8e88c692f8c68dbfe0c0bc..1aba2fdc1f4edf3b1d581fe3513c94ad7b90a334 100644 (file)
--- a/util.c
+++ b/util.c
@@ -25,6 +25,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <pthread.h>
+#include <signal.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -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 e65ab406b286db3c531395479c17cf0b7aa9d4fa..221f507089459419abaa253b55b950138e13dc86 100644 (file)
--- 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 */