Mercurial > hg > index.fcgi > dwm > dwm-3.6.1-11pba
comparison util.c @ 0:7024076fa948
initial add
author | paulo@localhost |
---|---|
date | Sun, 22 Mar 2009 23:26:35 -0700 |
parents | |
children | 0968b3739b8d |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e729f2a89395 |
---|---|
1 /* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> | |
2 * See LICENSE file for license details. | |
3 */ | |
4 #include "dwm.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, "dwm: execl '%s -c %s'", shell, arg->cmd); | |
49 perror(" failed"); | |
50 } | |
51 exit(0); | |
52 } | |
53 wait(0); | |
54 } |