st-externalpipe-0.8.2.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.2.diff (1563B)
---
1 diff --git a/st.c b/st.c
2 index ede7ae6..f55d30f 100644
3 --- a/st.c
4 +++ b/st.c
5 @@ -1914,6 +1914,59 @@ strparse(void)
6 }
7 }
8
9 +void
10 +externalpipe(const Arg *arg)
11 +{
12 + int to[2];
13 + char buf[UTF_SIZ];
14 + void (*oldsigpipe)(int);
15 + Glyph *bp, *end;
16 + int lastpos, n, newline;
17 +
18 + if (pipe(to) == -1)
19 + return;
20 +
21 + switch (fork()) {
22 + case -1:
23 + close(to[0]);
24 + close(to[1]);
25 + return;
26 + case 0:
27 + dup2(to[0], STDIN_FILENO);
28 + close(to[0]);
29 + close(to[1]);
30 + execvp(((char **)arg->v)[0], (char **)arg->v);
31 + fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
32 + perror("failed");
33 + exit(0);
34 + }
35 +
36 + close(to[0]);
37 + /* ignore sigpipe for now, in case child exists early */
38 + oldsigpipe = signal(SIGPIPE, SIG_IGN);
39 + newline = 0;
40 + for (n = 0; n < term.row; n++) {
41 + bp = term.line[n];
42 + lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
43 + if (lastpos < 0)
44 + break;
45 + end = &bp[lastpos + 1];
46 + for (; bp < end; ++bp)
47 + if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
48 + break;
49 + if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
50 + continue;
51 + if (xwrite(to[1], "\n", 1) < 0)
52 + break;
53 + newline = 0;
54 + }
55 + if (newline)
56 + (void)xwrite(to[1], "\n", 1);
57 + close(to[1]);
58 + /* restore */
59 + signal(SIGPIPE, oldsigpipe);
60 +}
61 +
62 void
63 strdump(void)
64 {
65 diff --git a/st.h b/st.h
66 index 4da3051..cb7101f 100644
67 --- a/st.h
68 +++ b/st.h
69 @@ -80,6 +80,7 @@ void die(const char *, ...);
70 void redraw(void);
71 void draw(void);
72
73 +void externalpipe(const Arg *);
74 void printscreen(const Arg *);
75 void printsel(const Arg *);
76 void sendbreak(const Arg *);