Refactoring sigchld ref. #156 (#159)

This commit is contained in:
Stein Gunnar Bakkeby 2024-11-25 20:48:52 +01:00 committed by GitHub
parent c4c5113fbd
commit 4dec55eead
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 21 additions and 49 deletions

View file

@ -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

View file

@ -40,7 +40,5 @@ newterm(const Arg* a)
default:
exit(0);
}
default:
wait(NULL);
}
}

View file

@ -1,11 +1,14 @@
#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;
@ -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);
}
}

40
st.c
View file

@ -820,31 +820,8 @@ 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;
}
#else
if (pid != p)
return;
#endif // EXTERNALPIPE_PATCH
while ((p = waitpid(-1, &stat, WNOHANG)) > 0) {
if (p == pid) {
#if EXTERNALPIPEIN_PATCH && EXTERNALPIPE_PATCH
close(csdfd);
#endif // EXTERNALPIPEIN_PATCH
@ -855,6 +832,8 @@ sigchld(int a)
die("child terminated due to signal %d\n", WTERMSIG(stat));
_exit(0);
}
}
}
void
stty(char **args)
@ -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;