Introduction
Introduction Statistics Contact Development Disclaimer Help
st-externalpipe-0.8.5.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
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(e…
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,…
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)) …
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.