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