]> prime8.dev >> repos - ttyd.git/commitdiff
Fix signal string not work, revert to sys_signame
authorShuanglei Tao <tsl0922@gmail.com>
Wed, 8 Feb 2017 14:16:38 +0000 (22:16 +0800)
committerShuanglei Tao <tsl0922@gmail.com>
Wed, 8 Feb 2017 15:14:24 +0000 (23:14 +0800)
src/protocol.c
src/utils.c

index 382f4a77d67f0e47ebc75a4c425279af0bee61e6..658542e7dfb81de83dd1ee04c611dea003668dee 100644 (file)
@@ -84,7 +84,7 @@ tty_client_destroy(struct tty_client *client) {
     client->running = false;
 
     // kill process and free resource
-    lwsl_notice("sending %s to process %d\n", server->sig_name, client->pid);
+    lwsl_notice("sending %s (%d) to process %d\n", server->sig_name, server->sig_code, client->pid);
     if (kill(client->pid, server->sig_code) != 0) {
         lwsl_err("kill: pid, errno: %d (%s)\n", client->pid, errno, strerror(errno));
     }
index b0bef4cc10094d8da1979d7daad379d413902b80..b2fe8d67aa939140537521b8017851c77bfcd68c 100644 (file)
@@ -7,9 +7,29 @@
 #include <string.h>
 #include <signal.h>
 
+#ifdef __linux__
+// https://github.com/karelzak/util-linux/blob/master/misc-utils/kill.c
+const char *sys_signame[NSIG] = {
+    "zero",  "HUP",  "INT",   "QUIT", "ILL",   "TRAP", "ABRT", "UNUSED",
+    "FPE",   "KILL", "USR1",  "SEGV", "USR2",  "PIPE", "ALRM", "TERM",
+    "STKFLT","CHLD", "CONT",  "STOP", "TSTP",  "TTIN", "TTOU", "URG",
+    "XCPU",  "XFSZ", "VTALRM","PROF", "WINCH", "IO",   "PWR",  "SYS", NULL
+};
+#endif
+
 #if defined(_WIN32) || defined(__CYGWIN__)
 #include <windows.h>
 #include <shellapi.h>
+// https://github.com/mirror/newlib-cygwin/blob/master/winsup/cygwin/strsig.cc
+#ifndef NSIG
+#define NSIG 33
+#endif
+const char *sys_signame[NSIG] = {
+    "zero",  "HUP",  "INT",   "QUIT", "ILL",   "TRAP", "IOT",  "EMT",
+    "FPE",   "KILL", "BUS",   "SEGV", "SYS",   "PIPE", "ALRM", "TERM",
+    "URG",   "STOP", "TSTP",  "CONT", "CHLD",  "TTIN", "TTOU", "IO",
+    "XCPU",  "XFSZ", "VTALRM","PROF", "WINCH", "PWR",  "USR1", "USR2", NULL
+};
 #endif
 
 void *
@@ -50,19 +70,19 @@ endswith(const char *str, const char *suffix) {
 
 int
 get_sig_name(int sig, char *buf) {
-    int n = sprintf(buf, "SIG%s", sig < NSIG ? strsignal(sig) : "unknown");
+    int n = sprintf(buf, "SIG%s", sig < NSIG ? sys_signame[sig] : "unknown");
     uppercase(buf);
     return n;
 }
 
 int
 get_sig(const char *sig_name) {
-    if (strcasestr(sig_name, "sig") != sig_name || strlen(sig_name) <= 3) {
+    if (strlen(sig_name) <= 3 || strcasestr(sig_name, "sig") == NULL) {
         return -1;
     }
     for (int sig = 1; sig < NSIG; sig++) {
-        const char *name = strsignal(sig);
-        if (strcasecmp(name, sig_name + 3) == 0)
+        const char *name = sys_signame[sig];
+        if (name != NULL && strcasecmp(name, sig_name + 3) == 0)
             return sig;
     }
     return -1;