sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | 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