sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit 42d5e4b900e346ffded7f89501ecd530808f07ac
parent e8d1090443781837f3c0d7693a97e5a3dce49643
Author: Christian Tenllado <ctenllado@gmail.com>
Date:   Mon,  4 May 2020 19:52:27 +0200

Prevent reset of SIGCHILD handler to default

This patch fixes a bug in the externalpipe patch, and should be applied
on top of it. It prevents the reset of the signal handler set on
SIGCHILD, when the forked process that executes the external process
exits. I opted for switching from signal to sigaction instead of
rearming the signal in the sigchld function, just because it is the
recommended function (although I tried both ways and both worked).

Diffstat:
Ast.suckless.org/patches/externalpipe/st-externalpipe-sigaction-20200418-30e1771.diff | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+), 0 deletions(-)

diff --git a/st.suckless.org/patches/externalpipe/st-externalpipe-sigaction-20200418-30e1771.diff b/st.suckless.org/patches/externalpipe/st-externalpipe-sigaction-20200418-30e1771.diff @@ -0,0 +1,51 @@ +From 103531d8ecaf98322a45d956bc13f9da5cd68853 Mon Sep 17 00:00:00 2001 +From: Christian Tenllado <ctenllado@gmail.com> +Date: Sat, 18 Apr 2020 20:45:40 +0200 +Subject: [PATCH] externalpipe sigaction + +This patch should be applied on top of the externalpipe patch. It +prevents the reset of the signal handler set on SIGCHILD, when the +forked process that executes the external process exits. I opted for +switching from signal to sigaction instead of rearming the signal in the +sigchld function, just because it is the recommended function (although I +tried both ways and both worked). +--- + st.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/st.c b/st.c +index ab291ac..0824894 100644 +--- a/st.c ++++ b/st.c +@@ -712,7 +712,7 @@ sigchld(int a) + int stat; + pid_t p; + +- if ((p = waitpid(pid, &stat, WNOHANG)) < 0) ++ if ((p = waitpid(-1, &stat, WNOHANG)) < 0) + die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); + + if (pid != p) +@@ -753,6 +753,7 @@ int + ttynew(char *line, char *cmd, char *out, char **args) + { + int m, s; ++ struct sigaction sa; + + if (out) { + term.mode |= MODE_PRINT; +@@ -804,7 +805,10 @@ ttynew(char *line, char *cmd, char *out, char **args) + #endif + close(s); + cmdfd = m; +- signal(SIGCHLD, sigchld); ++ memset(&sa, 0, sizeof(sa)); ++ sigemptyset(&sa.sa_mask); ++ sa.sa_handler = sigchld; ++ sigaction(SIGCHLD, &sa, NULL); + break; + } + return cmdfd; +-- +2.20.1 +