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