util.c (1061B)
1 /* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> 2 * See LICENSE file for license details. 3 */ 4 #include "2wm.h" 5 #include <stdarg.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <sys/wait.h> 9 #include <unistd.h> 10 11 /* extern */ 12 13 void * 14 emallocz(unsigned int size) { 15 void *res = calloc(1, size); 16 17 if(!res) 18 eprint("fatal: could not malloc() %u bytes\n", size); 19 return res; 20 } 21 22 void 23 eprint(const char *errstr, ...) { 24 va_list ap; 25 26 va_start(ap, errstr); 27 vfprintf(stderr, errstr, ap); 28 va_end(ap); 29 exit(EXIT_FAILURE); 30 } 31 32 void 33 spawn(Arg *arg) { 34 static char *shell = NULL; 35 36 if(!shell && !(shell = getenv("SHELL"))) 37 shell = "/bin/sh"; 38 if(!arg->cmd) 39 return; 40 /* The double-fork construct avoids zombie processes and keeps the code 41 * clean from stupid signal handlers. */ 42 if(fork() == 0) { 43 if(fork() == 0) { 44 if(dpy) 45 close(ConnectionNumber(dpy)); 46 setsid(); 47 execl(shell, shell, "-c", arg->cmd, (char *)NULL); 48 fprintf(stderr, "2wm: execl '%s -c %s'", shell, arg->cmd); 49 perror(" failed"); 50 } 51 exit(0); 52 } 53 wait(0); 54 }