util.c
changeset 823 fb5cbf0bd923
parent 813 0ed770c96e51
child 857 453788ae925c
equal deleted inserted replaced
822:72d7221858aa 823:fb5cbf0bd923
    28 	va_end(ap);
    28 	va_end(ap);
    29 	exit(EXIT_FAILURE);
    29 	exit(EXIT_FAILURE);
    30 }
    30 }
    31 
    31 
    32 void
    32 void
    33 spawn(Arg arg) {
    33 spawn(const char *arg) {
    34 	static char *shell = NULL;
    34 	static char *shell = NULL;
    35 
    35 
    36 	if(!shell && !(shell = getenv("SHELL")))
    36 	if(!shell && !(shell = getenv("SHELL")))
    37 		shell = "/bin/sh";
    37 		shell = "/bin/sh";
    38 	if(!arg.cmd)
    38 	if(!arg)
    39 		return;
    39 		return;
    40 	/* The double-fork construct avoids zombie processes and keeps the code
    40 	/* The double-fork construct avoids zombie processes and keeps the code
    41 	 * clean from stupid signal handlers. */
    41 	 * clean from stupid signal handlers. */
    42 	if(fork() == 0) {
    42 	if(fork() == 0) {
    43 		if(fork() == 0) {
    43 		if(fork() == 0) {
    44 			if(dpy)
    44 			if(dpy)
    45 				close(ConnectionNumber(dpy));
    45 				close(ConnectionNumber(dpy));
    46 			setsid();
    46 			setsid();
    47 			execl(shell, shell, "-c", arg.cmd, (char *)NULL);
    47 			execl(shell, shell, "-c", arg, (char *)NULL);
    48 			fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg.cmd);
    48 			fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg);
    49 			perror(" failed");
    49 			perror(" failed");
    50 		}
    50 		}
    51 		exit(0);
    51 		exit(0);
    52 	}
    52 	}
    53 	wait(0);
    53 	wait(0);