iApply externalpipe patch to default. - st - Simple Terminal Err gopher.r-36.net 70 i Err gopher.r-36.net 70 1Log /scm/st//log.gph gopher.r-36.net 70 1Files /scm/st//files.gph gopher.r-36.net 70 1Refs /scm/st//refs.gph gopher.r-36.net 70 1README /scm/st//file/README.gph gopher.r-36.net 70 1LICENSE /scm/st//file/LICENSE.gph gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1commit c5087aac7bbdbffd5a26a578fb1f401b48b91bf1 /scm/st//commit/c5087aac7bbdbffd5a26a578fb1f401b48b91bf1.gph gopher.r-36.net 70 1parent c63a87cd936c1eeef14c4c21572e5b782d3df4bc /scm/st//commit/c63a87cd936c1eeef14c4c21572e5b782d3df4bc.gph gopher.r-36.net 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net gopher.r-36.net 70 iDate: Sun, 19 Feb 2017 16:45:51 +0100 Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iApply externalpipe patch to default. Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iDiffstat: Err gopher.r-36.net 70 i st.c | 57 +++++++++++++++++++++++++++++++ Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i1 file changed, 57 insertions(+), 0 deletions(-) Err gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1diff --git a/st.c b/st.c /scm/st//file/st.c.gph gopher.r-36.net 70 i@@ -344,6 +344,7 @@ static void printscreen(const Arg *) ; Err gopher.r-36.net 70 i static void iso14755(const Arg *); Err gopher.r-36.net 70 i static void toggleprinter(const Arg *); Err gopher.r-36.net 70 i static void sendbreak(const Arg *); Err gopher.r-36.net 70 i+static void externalpipe(const Arg *); Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i /* Config.h for applying patches and the configuration. */ Err gopher.r-36.net 70 i #include "config.h" Err gopher.r-36.net 70 i@@ -2996,6 +2997,62 @@ eschandle(uchar ascii) Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i void Err gopher.r-36.net 70 i+externalpipe(const Arg *arg) Err gopher.r-36.net 70 i+{ Err gopher.r-36.net 70 i+ int to[2]; /* 0 = read, 1 = write */ Err gopher.r-36.net 70 i+ pid_t child; Err gopher.r-36.net 70 i+ int n; Err gopher.r-36.net 70 i+ void (*oldsigpipe)(int); Err gopher.r-36.net 70 i+ char buf[UTF_SIZ]; Err gopher.r-36.net 70 i+ Glyph *bp, *end; Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ if(pipe(to) == -1) Err gopher.r-36.net 70 i+ return; Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ /* sigchld() handles this */ Err gopher.r-36.net 70 i+ switch(child = fork()){ Err gopher.r-36.net 70 i+ case -1: Err gopher.r-36.net 70 i+ close(to[0]), close(to[1]); Err gopher.r-36.net 70 i+ return; Err gopher.r-36.net 70 i+ case 0: Err gopher.r-36.net 70 i+ /* child */ Err gopher.r-36.net 70 i+ close(to[1]); Err gopher.r-36.net 70 i+ dup2(to[0], STDIN_FILENO); /* 0<&to */ Err gopher.r-36.net 70 i+ close(to[0]); Err gopher.r-36.net 70 i+ execvp( Err gopher.r-36.net 70 i+ "sh", Err gopher.r-36.net 70 i+ (char *const []){ Err gopher.r-36.net 70 i+ "/bin/sh", Err gopher.r-36.net 70 i+ "-c", Err gopher.r-36.net 70 i+ (char *)arg->v, Err gopher.r-36.net 70 i+ 0 Err gopher.r-36.net 70 i+ }); Err gopher.r-36.net 70 i+ exit(127); Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ /* parent */ Err gopher.r-36.net 70 i+ close(to[0]); Err gopher.r-36.net 70 i+ /* ignore sigpipe for now, in case child exits early */ Err gopher.r-36.net 70 i+ oldsigpipe = signal(SIGPIPE, SIG_IGN); Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ for(n = 0; n < term.row; n++){ Err gopher.r-36.net 70 i+ bp = &term.line[n][0]; Err gopher.r-36.net 70 i+ end = &bp[MIN(tlinelen(n), term.col) - 1]; Err gopher.r-36.net 70 i+ if(bp != end || bp->u != ' ') Err gopher.r-36.net 70 i+ for(; bp <= end; ++bp) Err gopher.r-36.net 70 i+ if(xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0) Err gopher.r-36.net 70 i+ break; Err gopher.r-36.net 70 i+ if(xwrite(to[1], "\n", 1) < 0) Err gopher.r-36.net 70 i+ break; Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ close(to[1]); Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ /* restore */ Err gopher.r-36.net 70 i+ signal(SIGPIPE, oldsigpipe); Err gopher.r-36.net 70 i+} Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+void Err gopher.r-36.net 70 i ttputc(Rune u) Err gopher.r-36.net 70 i { Err gopher.r-36.net 70 i char c[UTF_SIZ]; Err gopher.r-36.net 70 .