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:
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;