aewl
diff 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 |
line diff
1.1 --- a/util.c Mon Jul 10 22:16:48 2006 +0200 1.2 +++ b/util.c Tue Jul 11 11:10:05 2006 +0200 1.3 @@ -13,6 +13,8 @@ 1.4 1.5 #include "util.h" 1.6 1.7 +static char *shell = NULL; 1.8 + 1.9 void 1.10 error(char *errstr, ...) { 1.11 va_list ap; 1.12 @@ -82,19 +84,65 @@ 1.13 } 1.14 1.15 void 1.16 -spawn(Display *dpy, const char *shell, const char *cmd) 1.17 +spawn(Display *dpy, const char *cmd) 1.18 { 1.19 - if(!cmd || !shell) 1.20 + if(!shell && !(shell = getenv("SHELL"))) 1.21 + shell = "/bin/sh"; 1.22 + 1.23 + if(!cmd) 1.24 return; 1.25 if(fork() == 0) { 1.26 if(fork() == 0) { 1.27 + setsid(); 1.28 if(dpy) 1.29 close(ConnectionNumber(dpy)); 1.30 - execl(shell, shell, "-c", cmd, (const char *)0); 1.31 - fprintf(stderr, "gridwm: execl %s", shell); 1.32 + execlp(shell, "shell", "-c", cmd, NULL); 1.33 + fprintf(stderr, "gridwm: execvp %s", cmd); 1.34 perror(" failed"); 1.35 } 1.36 exit (0); 1.37 } 1.38 wait(0); 1.39 } 1.40 + 1.41 +void 1.42 +pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) 1.43 +{ 1.44 + unsigned int l, n; 1.45 + int pfd[2]; 1.46 + 1.47 + if(!shell && !(shell = getenv("SHELL"))) 1.48 + shell = "/bin/sh"; 1.49 + 1.50 + if(!cmd) 1.51 + return; 1.52 + 1.53 + if(pipe(pfd) == -1) { 1.54 + perror("pipe"); 1.55 + exit(1); 1.56 + } 1.57 + 1.58 + if(fork() == 0) { 1.59 + setsid(); 1.60 + if(dpy) 1.61 + close(ConnectionNumber(dpy)); 1.62 + dup2(pfd[1], STDOUT_FILENO); 1.63 + close(pfd[0]); 1.64 + close(pfd[1]); 1.65 + execlp(shell, "shell", "-c", cmd, NULL); 1.66 + fprintf(stderr, "gridwm: execvp %s", cmd); 1.67 + perror(" failed"); 1.68 + } 1.69 + else { 1.70 + n = 0; 1.71 + close(pfd[1]); 1.72 + while(l > n) { 1.73 + if((l = read(pfd[0], buf + n, len - n)) < 1) 1.74 + break; 1.75 + n += l; 1.76 + } 1.77 + close(pfd[0]); 1.78 + buf[n - 1] = 0; 1.79 + } 1.80 + wait(0); 1.81 +}