st-externalpipe-sigaction-20200418-30e1771.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
st-externalpipe-sigaction-20200418-30e1771.diff (1428B)
---
1 From 103531d8ecaf98322a45d956bc13f9da5cd68853 Mon Sep 17 00:00:00 2001
2 From: Christian Tenllado <ctenllado@gmail.com>
3 Date: Sat, 18 Apr 2020 20:45:40 +0200
4 Subject: [PATCH] externalpipe sigaction
5
6 This patch should be applied on top of the externalpipe patch. It
7 prevents the reset of the signal handler set on SIGCHILD, when the
8 forked process that executes the external process exits. I opted for
9 switching from signal to sigaction instead of rearming the signal in the
10 sigchld function, just because it is the recommended function (although I
11 tried both ways and both worked).
12 ---
13 st.c | 8 ++++++--
14 1 file changed, 6 insertions(+), 2 deletions(-)
15
16 diff --git a/st.c b/st.c
17 index ab291ac..0824894 100644
18 --- a/st.c
19 +++ b/st.c
20 @@ -712,7 +712,7 @@ sigchld(int a)
21 int stat;
22 pid_t p;
23
24 - if ((p = waitpid(pid, &stat, WNOHANG)) < 0)
25 + if ((p = waitpid(-1, &stat, WNOHANG)) < 0)
26 die("waiting for pid %hd failed: %s\n", pid, strerror(errno));
27
28 if (pid != p)
29 @@ -753,6 +753,7 @@ int
30 ttynew(char *line, char *cmd, char *out, char **args)
31 {
32 int m, s;
33 + struct sigaction sa;
34
35 if (out) {
36 term.mode |= MODE_PRINT;
37 @@ -804,7 +805,10 @@ ttynew(char *line, char *cmd, char *out, char **args)
38 #endif
39 close(s);
40 cmdfd = m;
41 - signal(SIGCHLD, sigchld);
42 + memset(&sa, 0, sizeof(sa));
43 + sigemptyset(&sa.sa_mask);
44 + sa.sa_handler = sigchld;
45 + sigaction(SIGCHLD, &sa, NULL);
46 break;
47 }
48 return cmdfd;
49 --
50 2.20.1
51