implemented pipe_spawn

This commit is contained in:
Anselm R. Garbe
2006-07-11 11:10:05 +02:00
parent 439e15d09f
commit 3a69c5173c
7 changed files with 70 additions and 15 deletions

56
util.c
View File

@ -13,6 +13,8 @@
#include "util.h"
static char *shell = NULL;
void
error(char *errstr, ...) {
va_list ap;
@ -82,19 +84,65 @@ swap(void **p1, void **p2)
}
void
spawn(Display *dpy, const char *shell, const char *cmd)
spawn(Display *dpy, const char *cmd)
{
if(!cmd || !shell)
if(!shell && !(shell = getenv("SHELL")))
shell = "/bin/sh";
if(!cmd)
return;
if(fork() == 0) {
if(fork() == 0) {
setsid();
if(dpy)
close(ConnectionNumber(dpy));
execl(shell, shell, "-c", cmd, (const char *)0);
fprintf(stderr, "gridwm: execl %s", shell);
execlp(shell, "shell", "-c", cmd, NULL);
fprintf(stderr, "gridwm: execvp %s", cmd);
perror(" failed");
}
exit (0);
}
wait(0);
}
void
pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd)
{
unsigned int l, n;
int pfd[2];
if(!shell && !(shell = getenv("SHELL")))
shell = "/bin/sh";
if(!cmd)
return;
if(pipe(pfd) == -1) {
perror("pipe");
exit(1);
}
if(fork() == 0) {
setsid();
if(dpy)
close(ConnectionNumber(dpy));
dup2(pfd[1], STDOUT_FILENO);
close(pfd[0]);
close(pfd[1]);
execlp(shell, "shell", "-c", cmd, NULL);
fprintf(stderr, "gridwm: execvp %s", cmd);
perror(" failed");
}
else {
n = 0;
close(pfd[1]);
while(l > n) {
if((l = read(pfd[0], buf + n, len - n)) < 1)
break;
n += l;
}
close(pfd[0]);
buf[n - 1] = 0;
}
wait(0);
}