From 4dec55eead895e216c5b51f0f7cc40f23362bf10 Mon Sep 17 00:00:00 2001 From: Stein Gunnar Bakkeby Date: Mon, 25 Nov 2024 20:48:52 +0100 Subject: [PATCH] Refactoring sigchld ref. #156 (#159) --- patch/externalpipe.c | 3 --- patch/newterm.c | 2 -- patch/rightclicktoplumb_x.c | 11 ++++---- st.c | 54 +++++++++++-------------------------- 4 files changed, 21 insertions(+), 49 deletions(-) diff --git a/patch/externalpipe.c b/patch/externalpipe.c index 7df5474..8328c37 100644 --- a/patch/externalpipe.c +++ b/patch/externalpipe.c @@ -1,5 +1,3 @@ -int extpipeactive = 0; - void #if EXTERNALPIPEIN_PATCH extpipe(const Arg *arg, int in) @@ -64,7 +62,6 @@ externalpipe(const Arg *arg) close(to[1]); /* restore */ signal(SIGPIPE, oldsigpipe); - extpipeactive = 1; } #if EXTERNALPIPEIN_PATCH diff --git a/patch/newterm.c b/patch/newterm.c index f06a0ce..a7430ce 100644 --- a/patch/newterm.c +++ b/patch/newterm.c @@ -40,7 +40,5 @@ newterm(const Arg* a) default: exit(0); } - default: - wait(NULL); } } diff --git a/patch/rightclicktoplumb_x.c b/patch/rightclicktoplumb_x.c index 1b9b2bc..674b602 100644 --- a/patch/rightclicktoplumb_x.c +++ b/patch/rightclicktoplumb_x.c @@ -1,15 +1,18 @@ #include void -plumb(char *sel) { +plumb(char *sel) +{ if (sel == NULL) return; + char cwd[PATH_MAX]; pid_t child; + if (subprocwd(cwd) != 0) return; - switch(child = fork()) { + switch (child = fork()) { case -1: return; case 0: @@ -18,7 +21,5 @@ plumb(char *sel) { if (execvp(plumb_cmd, (char *const []){plumb_cmd, sel, 0}) == -1) exit(1); exit(0); - default: - waitpid(child, NULL, 0); } -} \ No newline at end of file +} diff --git a/st.c b/st.c index 62a3419..69a6ea5 100644 --- a/st.c +++ b/st.c @@ -820,40 +820,19 @@ sigchld(int a) int stat; pid_t p; - #if EXTERNALPIPEIN_PATCH && EXTERNALPIPE_PATCH - if ((p = waitpid((extpipeactive ? -1 : pid), &stat, WNOHANG)) < 0) - #else - if ((p = waitpid(pid, &stat, WNOHANG)) < 0) - #endif // EXTERNALPIPEIN_PATCH - die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); + while ((p = waitpid(-1, &stat, WNOHANG)) > 0) { + if (p == pid) { + #if EXTERNALPIPEIN_PATCH && EXTERNALPIPE_PATCH + close(csdfd); + #endif // EXTERNALPIPEIN_PATCH - #if EXTERNALPIPE_PATCH - if (pid != p) { - if (!extpipeactive) - return; - - if (p == 0 && wait(&stat) < 0) - die("wait: %s\n", strerror(errno)); - - /* reinstall sigchld handler */ - signal(SIGCHLD, sigchld); - extpipeactive = 0; - return; + if (WIFEXITED(stat) && WEXITSTATUS(stat)) + die("child exited with status %d\n", WEXITSTATUS(stat)); + else if (WIFSIGNALED(stat)) + die("child terminated due to signal %d\n", WTERMSIG(stat)); + _exit(0); + } } - #else - if (pid != p) - return; - #endif // EXTERNALPIPE_PATCH - - #if EXTERNALPIPEIN_PATCH && EXTERNALPIPE_PATCH - close(csdfd); - #endif // EXTERNALPIPEIN_PATCH - - if (WIFEXITED(stat) && WEXITSTATUS(stat)) - die("child exited with status %d\n", WEXITSTATUS(stat)); - else if (WIFSIGNALED(stat)) - die("child terminated due to signal %d\n", WTERMSIG(stat)); - _exit(0); } void @@ -884,9 +863,7 @@ int ttynew(const char *line, char *cmd, const char *out, char **args) { int m, s; - #if EXTERNALPIPEIN_PATCH && EXTERNALPIPE_PATCH struct sigaction sa; - #endif // EXTERNALPIPEIN_PATCH if (out) { term.mode |= MODE_PRINT; @@ -944,15 +921,14 @@ ttynew(const char *line, char *cmd, const char *out, char **args) #if EXTERNALPIPEIN_PATCH && EXTERNALPIPE_PATCH csdfd = s; cmdfd = m; + #else + close(s); + cmdfd = m; + #endif // EXTERNALPIPEIN_PATCH memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); sa.sa_handler = sigchld; sigaction(SIGCHLD, &sa, NULL); - #else - close(s); - cmdfd = m; - signal(SIGCHLD, sigchld); - #endif // EXTERNALPIPEIN_PATCH break; } return cmdfd;