Introduction
Introduction Statistics Contact Development Disclaimer Help
st-externalpipe-0.5.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
st-externalpipe-0.5.diff (2100B)
---
1 diff --git a/st.c b/st.c
2 index 392f12d..31660c8 100644
3 --- a/st.c
4 +++ b/st.c
5 @@ -301,6 +301,7 @@ typedef union {
6 unsigned int ui;
7 float f;
8 const void *v;
9 + const char *s;
10 } Arg;
11
12 typedef struct {
13 @@ -315,6 +316,7 @@ static void clippaste(const Arg *);
14 static void numlock(const Arg *);
15 static void selpaste(const Arg *);
16 static void xzoom(const Arg *);
17 +static void externalpipe(const Arg *);
18 static void printsel(const Arg *);
19 static void printscreen(const Arg *) ;
20 static void toggleprinter(const Arg *);
21 @@ -1179,15 +1181,22 @@ execsh(void) {
22 void
23 sigchld(int a) {
24 int stat = 0;
25 + pid_t r;
26
27 - if(waitpid(pid, &stat, 0) < 0)
28 - die("Waiting for pid %hd failed: %s\n", pid, SERRNO);
29 + r = wait(&stat);
30 + if(r < 0)
31 + die("wait(): %s\n", strerror(errno));
32
33 - if(WIFEXITED(stat)) {
34 - exit(WEXITSTATUS(stat));
35 - } else {
36 - exit(EXIT_FAILURE);
37 + if(r == pid){
38 + /* _the_ sub process */
39 + if(WIFEXITED(stat)) {
40 + exit(WEXITSTATUS(stat));
41 + } else {
42 + exit(EXIT_FAILURE);
43 + }
44 }
45 +
46 + /* something else we've forked out */
47 }
48
49 void
50 @@ -2982,6 +2991,59 @@ xzoom(const Arg *arg) {
51 }
52
53 void
54 +externalpipe(const Arg *arg)
55 +{
56 + int to[2]; /* 0 = read, 1 = write */
57 + pid_t child;
58 + int y, x;
59 + void (*oldsigpipe)(int);
60 +
61 + if(pipe(to) == -1)
62 + return;
63 +
64 + /* sigchld() handles this */
65 + switch((child = fork())){
66 + case -1:
67 + close(to[0]), close(to[1]);
68 + return;
69 + case 0:
70 + /* child */
71 + close(to[1]);
72 + dup2(to[0], STDIN_FILENO); /* 0<&to */
73 + close(to[0]);
74 + execvp(
75 + "sh",
76 + (char *const []){
77 + "/bin/sh",
78 + "-c",
79 + (char *)arg->s,
80 + 0
81 + });
82 + exit(127);
83 + }
84 +
85 + /* parent */
86 + close(to[0]);
87 + /* ignore sigpipe for now, in case child exits early */
88 + oldsigpipe = signal(SIGPIPE, SIG_IGN);
89 +
90 + for(y = 0; y < term.row; y++){
91 + for(x = 0; x < term.col; x++){
92 + if(write(to[1], term.line[y][x].c, 1) == -1)
93 + goto done;
94 + }
95 + if(write(to[1], "\n", 1) == -1)
96 + break;
97 + }
98 +
99 +done:
100 + close(to[1]);
101 +
102 + /* restore */
103 + signal(SIGPIPE, oldsigpipe);
104 +}
105 +
106 +void
107 xinit(void) {
108 XGCValues gcvalues;
109 Cursor cursor;
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.