equal
deleted
inserted
replaced
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); |