Mercurial > aewl
comparison util.c @ 6:e0cefb3981c8
implemented pipe_spawn
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Tue, 11 Jul 2006 11:10:05 +0200 |
parents | e5018cae273f |
children | d567f430a81d |
comparison
equal
deleted
inserted
replaced
5:e5018cae273f | 6:e0cefb3981c8 |
---|---|
10 #include <sys/types.h> | 10 #include <sys/types.h> |
11 #include <sys/wait.h> | 11 #include <sys/wait.h> |
12 #include <unistd.h> | 12 #include <unistd.h> |
13 | 13 |
14 #include "util.h" | 14 #include "util.h" |
15 | |
16 static char *shell = NULL; | |
15 | 17 |
16 void | 18 void |
17 error(char *errstr, ...) { | 19 error(char *errstr, ...) { |
18 va_list ap; | 20 va_list ap; |
19 va_start(ap, errstr); | 21 va_start(ap, errstr); |
80 *p1 = *p2; | 82 *p1 = *p2; |
81 *p2 = tmp; | 83 *p2 = tmp; |
82 } | 84 } |
83 | 85 |
84 void | 86 void |
85 spawn(Display *dpy, const char *shell, const char *cmd) | 87 spawn(Display *dpy, const char *cmd) |
86 { | 88 { |
87 if(!cmd || !shell) | 89 if(!shell && !(shell = getenv("SHELL"))) |
90 shell = "/bin/sh"; | |
91 | |
92 if(!cmd) | |
88 return; | 93 return; |
89 if(fork() == 0) { | 94 if(fork() == 0) { |
90 if(fork() == 0) { | 95 if(fork() == 0) { |
96 setsid(); | |
91 if(dpy) | 97 if(dpy) |
92 close(ConnectionNumber(dpy)); | 98 close(ConnectionNumber(dpy)); |
93 execl(shell, shell, "-c", cmd, (const char *)0); | 99 execlp(shell, "shell", "-c", cmd, NULL); |
94 fprintf(stderr, "gridwm: execl %s", shell); | 100 fprintf(stderr, "gridwm: execvp %s", cmd); |
95 perror(" failed"); | 101 perror(" failed"); |
96 } | 102 } |
97 exit (0); | 103 exit (0); |
98 } | 104 } |
99 wait(0); | 105 wait(0); |
100 } | 106 } |
107 | |
108 void | |
109 pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) | |
110 { | |
111 unsigned int l, n; | |
112 int pfd[2]; | |
113 | |
114 if(!shell && !(shell = getenv("SHELL"))) | |
115 shell = "/bin/sh"; | |
116 | |
117 if(!cmd) | |
118 return; | |
119 | |
120 if(pipe(pfd) == -1) { | |
121 perror("pipe"); | |
122 exit(1); | |
123 } | |
124 | |
125 if(fork() == 0) { | |
126 setsid(); | |
127 if(dpy) | |
128 close(ConnectionNumber(dpy)); | |
129 dup2(pfd[1], STDOUT_FILENO); | |
130 close(pfd[0]); | |
131 close(pfd[1]); | |
132 execlp(shell, "shell", "-c", cmd, NULL); | |
133 fprintf(stderr, "gridwm: execvp %s", cmd); | |
134 perror(" failed"); | |
135 } | |
136 else { | |
137 n = 0; | |
138 close(pfd[1]); | |
139 while(l > n) { | |
140 if((l = read(pfd[0], buf + n, len - n)) < 1) | |
141 break; | |
142 n += l; | |
143 } | |
144 close(pfd[0]); | |
145 buf[n - 1] = 0; | |
146 } | |
147 wait(0); | |
148 } |