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