annotate util.c @ 541:08d3d329270a
using MASTER 600 again, it is definately better, and using urxvtc for the moment (it doesn't flickers on refreshes, but this is not because of Marc Lehmann, it is because of the original rxvt code)
author |
arg@mig29 |
date |
Thu, 26 Oct 2006 12:13:41 +0200 |
parents |
740c4bfc3124 |
children |
e90bf387bf6f |
rev |
line source |
arg@532
|
1 /* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
|
garbeam@2
|
2 * See LICENSE file for license details.
|
garbeam@2
|
3 */
|
garbeam@76
|
4 #include "dwm.h"
|
garbeam@2
|
5 #include <stdarg.h>
|
garbeam@2
|
6 #include <stdio.h>
|
garbeam@2
|
7 #include <stdlib.h>
|
garbeam@5
|
8 #include <sys/wait.h>
|
garbeam@5
|
9 #include <unistd.h>
|
garbeam@5
|
10
|
garbeam@84
|
11 /* extern */
|
garbeam@76
|
12
|
garbeam@3
|
13 void *
|
arg@461
|
14 emallocz(unsigned int size) {
|
garbeam@3
|
15 void *res = calloc(1, size);
|
arg@123
|
16
|
garbeam@3
|
17 if(!res)
|
arg@325
|
18 eprint("fatal: could not malloc() %u bytes\n", size);
|
garbeam@3
|
19 return res;
|
garbeam@3
|
20 }
|
garbeam@3
|
21
|
garbeam@3
|
22 void
|
arg@461
|
23 eprint(const char *errstr, ...) {
|
garbeam@76
|
24 va_list ap;
|
arg@123
|
25
|
garbeam@76
|
26 va_start(ap, errstr);
|
garbeam@76
|
27 vfprintf(stderr, errstr, ap);
|
garbeam@76
|
28 va_end(ap);
|
garbeam@92
|
29 exit(EXIT_FAILURE);
|
garbeam@76
|
30 }
|
garbeam@76
|
31
|
arg@270
|
32 void *
|
arg@461
|
33 erealloc(void *ptr, unsigned int size) {
|
arg@270
|
34 void *res = realloc(ptr, size);
|
arg@532
|
35
|
arg@270
|
36 if(!res)
|
arg@325
|
37 eprint("fatal: could not malloc() %u bytes\n", size);
|
arg@270
|
38 return res;
|
arg@270
|
39 }
|
arg@270
|
40
|
garbeam@76
|
41 void
|
arg@461
|
42 spawn(Arg *arg) {
|
arg@189
|
43 static char *shell = NULL;
|
arg@123
|
44
|
arg@189
|
45 if(!shell && !(shell = getenv("SHELL")))
|
arg@189
|
46 shell = "/bin/sh";
|
arg@189
|
47 if(!arg->cmd)
|
garbeam@5
|
48 return;
|
arg@471
|
49 /* The double-fork construct avoids zombie processes and keeps the code
|
arg@471
|
50 * clean from stupid signal handlers. */
|
garbeam@5
|
51 if(fork() == 0) {
|
garbeam@5
|
52 if(fork() == 0) {
|
garbeam@5
|
53 if(dpy)
|
garbeam@5
|
54 close(ConnectionNumber(dpy));
|
garbeam@9
|
55 setsid();
|
arg@338
|
56 execl(shell, shell, "-c", arg->cmd, (char *)NULL);
|
arg@217
|
57 fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg->cmd);
|
garbeam@5
|
58 perror(" failed");
|
garbeam@5
|
59 }
|
arg@138
|
60 exit(0);
|
garbeam@5
|
61 }
|
garbeam@5
|
62 wait(0);
|
garbeam@5
|
63 }
|