st-flexipatch

My st-flexipatch configuration
git clone git://git.ethandl.dev/st-flexipatch
Log | Files | Refs | README | LICENSE

commit 4dec55eead895e216c5b51f0f7cc40f23362bf10
parent c4c5113fbdfb97363c510abb89a8da7f4fb138b2
Author: Stein Gunnar Bakkeby <bakkeby@gmail.com>
Date:   Mon, 25 Nov 2024 20:48:52 +0100

Refactoring sigchld ref. #156 (#159)


Diffstat:
Mpatch/externalpipe.c | 3---
Mpatch/newterm.c | 2--
Mpatch/rightclicktoplumb_x.c | 12++++++------
Mst.c | 56++++++++++++++++----------------------------------------
4 files changed, 22 insertions(+), 51 deletions(-)

diff --git 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 @@ -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 @@ -1,15 +1,18 @@ #include <sys/wait.h> 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 @@ -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)); - - #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; + while ((p = waitpid(-1, &stat, WNOHANG)) > 0) { + if (p == pid) { + #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); + } } - #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; - 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 + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_handler = sigchld; + sigaction(SIGCHLD, &sa, NULL); break; } return cmdfd;