st-externalpipe-0.6.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.6.diff (1551B)
       ---
            1 diff --git a/st.c b/st.c
            2 index b89d094..124ed16 100644
            3 --- a/st.c
            4 +++ b/st.c
            5 @@ -326,6 +326,7 @@ static void clipcopy(const Arg *);
            6  static void clippaste(const Arg *);
            7  static void numlock(const Arg *);
            8  static void selpaste(const Arg *);
            9 +static void externalpipe(const Arg *);
           10  static void xzoom(const Arg *);
           11  static void xzoomabs(const Arg *);
           12  static void xzoomreset(const Arg *);
           13 @@ -2684,6 +2685,62 @@ eschandle(uchar ascii) {
           14  }
           15  
           16  void
           17 +externalpipe(const Arg *arg)
           18 +{
           19 +        int to[2]; /* 0 = read, 1 = write */
           20 +        pid_t child;
           21 +        int n;
           22 +        void (*oldsigpipe)(int);
           23 +        char buf[UTF_SIZ];
           24 +        Glyph *bp, *end;
           25 +
           26 +        if(pipe(to) == -1)
           27 +                return;
           28 +
           29 +        /* sigchld() handles this */
           30 +        switch(child = fork()){
           31 +                case -1:
           32 +                        close(to[0]), close(to[1]);
           33 +                        return;
           34 +                case 0:
           35 +                        /* child */
           36 +                        close(to[1]);
           37 +                        dup2(to[0], STDIN_FILENO); /* 0<&to */
           38 +                        close(to[0]);
           39 +                        execvp(
           40 +                                        "sh",
           41 +                                        (char *const []){
           42 +                                                "/bin/sh",
           43 +                                                "-c",
           44 +                                                (char *)arg->v,
           45 +                                                0
           46 +                                        });
           47 +                        exit(127);
           48 +        }
           49 +
           50 +        /* parent */
           51 +        close(to[0]);
           52 +        /* ignore sigpipe for now, in case child exits early */
           53 +        oldsigpipe = signal(SIGPIPE, SIG_IGN);
           54 +
           55 +        for(n = 0; n < term.row; n++){
           56 +                bp = &term.line[n][0];
           57 +                end = &bp[MIN(tlinelen(n), term.col) - 1];
           58 +                if(bp != end || bp->u != ' ')
           59 +                        for(; bp <= end; ++bp)
           60 +                                if(xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
           61 +                                        break;
           62 +                if(xwrite(to[1], "\n", 1) < 0)
           63 +                        break;
           64 +        }
           65 +
           66 +        close(to[1]);
           67 +
           68 +        /* restore */
           69 +        signal(SIGPIPE, oldsigpipe);
           70 +}
           71 +
           72 +void
           73  tputc(Rune u) {
           74          char c[UTF_SIZ];
           75          bool control;