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