st-externalpipe-0.8.5.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       st-externalpipe-0.8.5.diff (2296B)
       ---
            1 diff --git a/st.c b/st.c
            2 index 034954d..98f2589 100644
            3 --- a/st.c
            4 +++ b/st.c
            5 @@ -718,8 +718,14 @@ sigchld(int a)
            6          if ((p = waitpid(pid, &stat, WNOHANG)) < 0)
            7                  die("waiting for pid %hd failed: %s\n", pid, strerror(errno));
            8  
            9 -        if (pid != p)
           10 +        if (pid != p) {
           11 +                if (p == 0 && wait(&stat) < 0)
           12 +                        die("wait: %s\n", strerror(errno));
           13 +
           14 +                /* reinstall sigchld handler */
           15 +                signal(SIGCHLD, sigchld);
           16                  return;
           17 +        }
           18  
           19          if (WIFEXITED(stat) && WEXITSTATUS(stat))
           20                  die("child exited with status %d\n", WEXITSTATUS(stat));
           21 @@ -803,7 +809,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args)
           22                  break;
           23          default:
           24  #ifdef __OpenBSD__
           25 -                if (pledge("stdio rpath tty proc", NULL) == -1)
           26 +                if (pledge("stdio rpath tty proc exec", NULL) == -1)
           27                          die("pledge\n");
           28  #endif
           29                  close(s);
           30 @@ -1991,6 +1997,59 @@ strparse(void)
           31          }
           32  }
           33  
           34 +void
           35 +externalpipe(const Arg *arg)
           36 +{
           37 +        int to[2];
           38 +        char buf[UTF_SIZ];
           39 +        void (*oldsigpipe)(int);
           40 +        Glyph *bp, *end;
           41 +        int lastpos, n, newline;
           42 +
           43 +        if (pipe(to) == -1)
           44 +                return;
           45 +
           46 +        switch (fork()) {
           47 +        case -1:
           48 +                close(to[0]);
           49 +                close(to[1]);
           50 +                return;
           51 +        case 0:
           52 +                dup2(to[0], STDIN_FILENO);
           53 +                close(to[0]);
           54 +                close(to[1]);
           55 +                execvp(((char **)arg->v)[0], (char **)arg->v);
           56 +                fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
           57 +                perror("failed");
           58 +                exit(0);
           59 +        }
           60 +
           61 +        close(to[0]);
           62 +        /* ignore sigpipe for now, in case child exists early */
           63 +        oldsigpipe = signal(SIGPIPE, SIG_IGN);
           64 +        newline = 0;
           65 +        for (n = 0; n < term.row; n++) {
           66 +                bp = term.line[n];
           67 +                lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
           68 +                if (lastpos < 0)
           69 +                        break;
           70 +                end = &bp[lastpos + 1];
           71 +                for (; bp < end; ++bp)
           72 +                        if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
           73 +                                break;
           74 +                if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
           75 +                        continue;
           76 +                if (xwrite(to[1], "\n", 1) < 0)
           77 +                        break;
           78 +                newline = 0;
           79 +        }
           80 +        if (newline)
           81 +                (void)xwrite(to[1], "\n", 1);
           82 +        close(to[1]);
           83 +        /* restore */
           84 +        signal(SIGPIPE, oldsigpipe);
           85 +}
           86 +
           87  void
           88  strdump(void)
           89  {
           90 diff --git a/st.h b/st.h
           91 index fd3b0d8..754cd08 100644
           92 --- a/st.h
           93 +++ b/st.h
           94 @@ -81,6 +81,7 @@ void die(const char *, ...);
           95  void redraw(void);
           96  void draw(void);
           97  
           98 +void externalpipe(const Arg *);
           99  void printscreen(const Arg *);
          100  void printsel(const Arg *);
          101  void sendbreak(const Arg *);
          102 -- 
          103 2.42.0
          104