Created
November 6, 2018 06:22
Revisions
-
rem7 created this gist
Nov 6, 2018 .There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,84 @@ diff --git a/src/runsvdir.c b/src/runsvdir.c index 07c1d8e..5197bec 100644 --- a/src/runsvdir.c +++ b/src/runsvdir.c @@ -2,6 +2,7 @@ #include <sys/stat.h> #include <unistd.h> #include <signal.h> +#include <sys/wait.h> #include "direntry.h" #include "strerr.h" #include "error.h" @@ -53,6 +54,7 @@ void warn3x(char *m1, char *m2, char *m3) { } void s_term() { exitsoon =1; } void s_hangup() { exitsoon =2; } +void s_usr1() { exitsoon =3; } void runsv(int no, char *name) { int pid; @@ -70,6 +72,7 @@ void runsv(int no, char *name) { prog[2] =0; sig_uncatch(sig_hangup); sig_uncatch(sig_term); + sig_uncatch(sig_usr1); if (pgrp) setsid(); pathexec_run(*prog, prog, (const char* const*)environ); fatal("unable to start runsv ", name); @@ -183,6 +186,7 @@ int main(int argc, char **argv) { sig_catch(sig_term, s_term); sig_catch(sig_hangup, s_hangup); + sig_catch(sig_usr1, s_usr1); svdir =*argv++; if (argv && *argv) { rplog =*argv; @@ -272,13 +276,22 @@ int main(int argc, char **argv) { rplog[i -1] =rplog[i]; rplog[rploglen -1] =ch; } - + + int status =0; switch(exitsoon) { case 1: _exit(0); case 2: for (i =0; i < svnum; i++) if (sv[i].pid) kill(sv[i].pid, SIGTERM); _exit(111); + case 3: + for (i =0; i < svnum; i++) { + if (sv[i].pid) { + kill(sv[i].pid, SIGTERM); + waitpid(sv[i].pid,&status,0); + } + }; + _exit(112); } } /* not reached */ diff --git a/src/sig.c b/src/sig.c index 423d18e..cc6d155 100644 --- a/src/sig.c +++ b/src/sig.c @@ -10,6 +10,7 @@ int sig_hangup = SIGHUP; int sig_int = SIGINT; int sig_pipe = SIGPIPE; int sig_term = SIGTERM; +int sig_usr1 = SIGUSR1; void (*sig_defaulthandler)() = SIG_DFL; void (*sig_ignorehandler)() = SIG_IGN; diff --git a/src/sig.h b/src/sig.h index 2a3c780..fd24ffc 100644 --- a/src/sig.h +++ b/src/sig.h @@ -10,6 +10,7 @@ extern int sig_hangup; extern int sig_int; extern int sig_pipe; extern int sig_term; +extern int sig_usr1; extern void (*sig_defaulthandler)(); extern void (*sig_ignorehandler)();