From 48b6bc1eb6d6987bc29dcb4053f73b3895f03652 Mon Sep 17 00:00:00 2001 From: Dirk Zimoch Date: Fri, 16 Apr 2021 18:31:12 +0200 Subject: [PATCH] allow signal names for --killsig and print signal name when child is killed --- procServ.cc | 126 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 118 insertions(+), 8 deletions(-) diff --git a/procServ.cc b/procServ.cc index 750a6c1..232ef4f 100644 --- a/procServ.cc +++ b/procServ.cc @@ -95,6 +95,116 @@ int logFileFD=-1; // FD for log file char *logPort; // address for logger connections int debugFD=-1; // FD for debug output +#define SIGNALDEF(s) {s, #s}, +static struct {int sig; const char* name;} signals[] = { +/* POSIX.1-1990 signals */ + SIGNALDEF(SIGHUP) + SIGNALDEF(SIGINT) + SIGNALDEF(SIGQUIT) + SIGNALDEF(SIGILL) + SIGNALDEF(SIGABRT) + SIGNALDEF(SIGFPE) + SIGNALDEF(SIGKILL) + SIGNALDEF(SIGSEGV) + SIGNALDEF(SIGPIPE) + SIGNALDEF(SIGALRM) + SIGNALDEF(SIGTERM) + SIGNALDEF(SIGUSR1) + SIGNALDEF(SIGUSR2) + SIGNALDEF(SIGCHLD) + SIGNALDEF(SIGCONT) + SIGNALDEF(SIGSTOP) + SIGNALDEF(SIGTSTP) + SIGNALDEF(SIGTTIN) + SIGNALDEF(SIGTTOU) +/* POSIX.1-2001 signals */ +#ifdef SIGBUS + SIGNALDEF(SIGBUS) + SIGNALDEF(SIGPOLL) + SIGNALDEF(SIGPROF) + SIGNALDEF(SIGSYS) + SIGNALDEF(SIGTRAP) + SIGNALDEF(SIGURG) + SIGNALDEF(SIGVTALRM) + SIGNALDEF(SIGXCPU) + SIGNALDEF(SIGXFSZ) +#endif +/* other signals */ +#ifdef SIGIOT + SIGNALDEF(SIGIOT) +#endif +#ifdef SIGEMT + SIGNALDEF(SIGEMT) +#endif +#ifdef SIGSTKFLT + SIGNALDEF(SIGSTKFLT) +#endif +#ifdef SIGIO + SIGNALDEF(SIGIO) +#endif +#ifdef SIGCLD + SIGNALDEF(SIGCLD) +#endif +#ifdef SIGPWR + SIGNALDEF(SIGPWR) +#endif +#ifdef SIGINFO + SIGNALDEF(SIGINFO) +#endif +#ifdef SIGLOST + SIGNALDEF(SIGLOST) +#endif +#ifdef SIGWINCH + SIGNALDEF(SIGWINCH) +#endif +#ifdef SIGUNUSED + SIGNALDEF(SIGUNUSED) +#endif + {0, 0} +}; + +static const char* signalname(int sig) +{ + int i; + for (i = 0; signals[i].sig != 0; i++) + if (signals[i].sig == sig) + return signals[i].name; +#ifdef SIGRTMIN + if (sig >= SIGRTMIN && sig <= SIGRTMAX) + { + static char name[] = "SIGRTMIN+XXXXXXXX"; + sprintf(name+9,"%d", sig - SIGRTMIN); + return name; + } +#endif + return ""; +} + +static int str_to_signal(const char* str) +{ + int i; + char* end; + long sig = 0; + if (!str) return -1; + sig = strtol(str, &end, 0); + if (!*end && sig > 0 && sig < NSIG) return sig; + if (strncasecmp(str, "SIG", 3) == 0) str+=3; + for (i = 0; signals[i].sig != 0; i++) + if (strcasecmp(str, signals[i].name+3) == 0) + return signals[i].sig; +#ifdef SIGRTMIN + if (strncasecmp(str, "RTMIN", 5) == 0) + sig = SIGRTMIN; + else if (strncasecmp(str, "RTMAX", 5) == 0) + sig = SIGRTMAX; + else return -1; + sig += strtol(str+5, &end, 0); + if (!*end && sig >= SIGRTMIN && sig <= SIGRTMAX) + return sig; +#endif + return -1; +} + #define MAX_CONNECTIONS 64 // mLoop runs the program @@ -179,7 +289,7 @@ void printHelp() " -i --ignore ignore all chars in (^ for ctrl)\n" " -I --info-file write instance information to this file\n" " -k --killcmd command to kill (reboot) the child (^ for ctrl)\n" - " --killsig signal to send to child when killing\n" + " --killsig signal to send to child when killing\n" " -l --logport allow log connections through telnet \n" " -L --logfile write log to , '-' logs to stdout\n" " --logstamp [] prefix log lines with timestamp [strftime format]\n" @@ -344,13 +454,13 @@ int main(int argc,char * argv[]) break; case 'K': // Kill signal - i = abs( atoi( optarg ) ); - if ( i < 32 ) { - killSig = i; + k = str_to_signal ( optarg ); + if ( k>=0 ) { + killSig = k; } else { fprintf( stderr, - "%s: invalid kill signal %d (>31) - using default (%d)\n", - procservName, i, killSig ); + "%s: invalid kill signal %s - using default (%d %s)\n", + procservName, optarg, killSig, signalname(killSig)); } break; @@ -797,8 +907,8 @@ void OnPollTimeout() if (WIFSIGNALED(wstatus)) { snprintf(buf+strlen(buf), BUFLEN-strlen(buf), - " The process was killed by signal %d", - WTERMSIG(wstatus)); + " The process was killed by %s", + signalname(WTERMSIG(wstatus))); } strncat(buf, NL, BUFLEN-strlen(buf)-1); SendToAll(buf, strlen(buf), NULL);