|  | @@ -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);
 | 
	
		
			
				|  |  | +}
 |