Mercurial > aewl
annotate util.c @ 6:e0cefb3981c8
implemented pipe_spawn
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Tue, 11 Jul 2006 11:10:05 +0200 |
parents | e5018cae273f |
children | d567f430a81d |
rev | line source |
---|---|
2 | 1 /* |
2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
3 * See LICENSE file for license details. | |
4 */ | |
5 | |
6 #include <stdarg.h> | |
7 #include <stdio.h> | |
8 #include <stdlib.h> | |
3
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
9 #include <string.h> |
5 | 10 #include <sys/types.h> |
11 #include <sys/wait.h> | |
12 #include <unistd.h> | |
13 | |
14 #include "util.h" | |
2 | 15 |
6 | 16 static char *shell = NULL; |
17 | |
2 | 18 void |
19 error(char *errstr, ...) { | |
20 va_list ap; | |
21 va_start(ap, errstr); | |
22 vfprintf(stderr, errstr, ap); | |
23 va_end(ap); | |
24 exit(1); | |
25 } | |
26 | |
3
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
27 static void |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
28 bad_malloc(unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
29 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
30 fprintf(stderr, "fatal: could not malloc() %d bytes\n", |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
31 (int) size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
32 exit(1); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
33 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
34 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
35 void * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
36 emallocz(unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
37 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
38 void *res = calloc(1, size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
39 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
40 bad_malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
41 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
42 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
43 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
44 void * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
45 emalloc(unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
46 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
47 void *res = malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
48 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
49 bad_malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
50 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
51 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
52 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
53 void * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
54 erealloc(void *ptr, unsigned int size) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
55 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
56 void *res = realloc(ptr, size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
57 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
58 bad_malloc(size); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
59 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
60 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
61 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
62 char * |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
63 estrdup(const char *str) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
64 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
65 void *res = strdup(str); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
66 if(!res) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
67 bad_malloc(strlen(str)); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
68 return res; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
69 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
70 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
71 void |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
72 failed_assert(char *a, char *file, int line) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
73 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
74 fprintf(stderr, "Assertion \"%s\" failed at %s:%d\n", a, file, line); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
75 abort(); |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
76 } |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
77 |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
78 void |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
79 swap(void **p1, void **p2) |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
80 { |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
81 void *tmp = *p1; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
82 *p1 = *p2; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
83 *p2 = tmp; |
e969f3575b7a
several new changes, made gridmenu working
Anselm R. Garbe <garbeam@wmii.de>
parents:
2
diff
changeset
|
84 } |
5 | 85 |
86 void | |
6 | 87 spawn(Display *dpy, const char *cmd) |
5 | 88 { |
6 | 89 if(!shell && !(shell = getenv("SHELL"))) |
90 shell = "/bin/sh"; | |
91 | |
92 if(!cmd) | |
5 | 93 return; |
94 if(fork() == 0) { | |
95 if(fork() == 0) { | |
6 | 96 setsid(); |
5 | 97 if(dpy) |
98 close(ConnectionNumber(dpy)); | |
6 | 99 execlp(shell, "shell", "-c", cmd, NULL); |
100 fprintf(stderr, "gridwm: execvp %s", cmd); | |
5 | 101 perror(" failed"); |
102 } | |
103 exit (0); | |
104 } | |
105 wait(0); | |
106 } | |
6 | 107 |
108 void | |
109 pipe_spawn(char *buf, unsigned int len, Display *dpy, const char *cmd) | |
110 { | |
111 unsigned int l, n; | |
112 int pfd[2]; | |
113 | |
114 if(!shell && !(shell = getenv("SHELL"))) | |
115 shell = "/bin/sh"; | |
116 | |
117 if(!cmd) | |
118 return; | |
119 | |
120 if(pipe(pfd) == -1) { | |
121 perror("pipe"); | |
122 exit(1); | |
123 } | |
124 | |
125 if(fork() == 0) { | |
126 setsid(); | |
127 if(dpy) | |
128 close(ConnectionNumber(dpy)); | |
129 dup2(pfd[1], STDOUT_FILENO); | |
130 close(pfd[0]); | |
131 close(pfd[1]); | |
132 execlp(shell, "shell", "-c", cmd, NULL); | |
133 fprintf(stderr, "gridwm: execvp %s", cmd); | |
134 perror(" failed"); | |
135 } | |
136 else { | |
137 n = 0; | |
138 close(pfd[1]); | |
139 while(l > n) { | |
140 if((l = read(pfd[0], buf + n, len - n)) < 1) | |
141 break; | |
142 n += l; | |
143 } | |
144 close(pfd[0]); | |
145 buf[n - 1] = 0; | |
146 } | |
147 wait(0); | |
148 } |