Blame


1 3d7e9092 2003-10-14 devnull #include <u.h>
2 3d7e9092 2003-10-14 devnull #include <libc.h>
3 3d7e9092 2003-10-14 devnull #include "plumb.h"
4 3d7e9092 2003-10-14 devnull
5 3d7e9092 2003-10-14 devnull static char attrbuf[4096];
6 3d7e9092 2003-10-14 devnull
7 b7e6f415 2003-11-23 devnull char *home;
8 b7e6f415 2003-11-23 devnull
9 3d7e9092 2003-10-14 devnull int
10 3d7e9092 2003-10-14 devnull plumbopen(char *name, int omode)
11 3d7e9092 2003-10-14 devnull {
12 915ce5c2 2003-11-25 devnull #if 0
13 3d7e9092 2003-10-14 devnull int fd, f;
14 3d7e9092 2003-10-14 devnull char *s;
15 915ce5c2 2003-11-25 devnull #endif
16 b7e6f415 2003-11-23 devnull char buf[256];
17 3d7e9092 2003-10-14 devnull
18 3d7e9092 2003-10-14 devnull if(name[0] == '/')
19 3d7e9092 2003-10-14 devnull return open(name, omode);
20 b7e6f415 2003-11-23 devnull if(home == nil){
21 b7e6f415 2003-11-23 devnull home = getenv("HOME");
22 b7e6f415 2003-11-23 devnull if(home == nil)
23 b7e6f415 2003-11-23 devnull return -1;
24 b7e6f415 2003-11-23 devnull }
25 b7e6f415 2003-11-23 devnull snprint(buf, sizeof buf, "%s/mnt/plumb", home);
26 915ce5c2 2003-11-25 devnull #if 0
27 915ce5c2 2003-11-25 devnull fd = open(buf, omode);
28 3d7e9092 2003-10-14 devnull if(fd >= 0)
29 3d7e9092 2003-10-14 devnull return fd;
30 3d7e9092 2003-10-14 devnull snprint(buf, sizeof buf, "/mnt/term/mnt/plumb/%s", name);
31 3d7e9092 2003-10-14 devnull fd = open(buf, omode);
32 3d7e9092 2003-10-14 devnull if(fd >= 0)
33 3d7e9092 2003-10-14 devnull return fd;
34 915ce5c2 2003-11-25 devnull /* try mounting service */
35 3d7e9092 2003-10-14 devnull s = getenv("plumbsrv");
36 3d7e9092 2003-10-14 devnull if(s == nil)
37 3d7e9092 2003-10-14 devnull return -1;
38 3d7e9092 2003-10-14 devnull snprint(buf, sizeof buf, "/mnt/plumb/%s", name);
39 915ce5c2 2003-11-25 devnull #endif
40 3d7e9092 2003-10-14 devnull return open(buf, omode);
41 3d7e9092 2003-10-14 devnull }
42 3d7e9092 2003-10-14 devnull
43 3d7e9092 2003-10-14 devnull static int
44 3d7e9092 2003-10-14 devnull Strlen(char *s)
45 3d7e9092 2003-10-14 devnull {
46 3d7e9092 2003-10-14 devnull if(s == nil)
47 3d7e9092 2003-10-14 devnull return 0;
48 3d7e9092 2003-10-14 devnull return strlen(s);
49 3d7e9092 2003-10-14 devnull }
50 3d7e9092 2003-10-14 devnull
51 3d7e9092 2003-10-14 devnull static char*
52 3d7e9092 2003-10-14 devnull Strcpy(char *s, char *t)
53 3d7e9092 2003-10-14 devnull {
54 3d7e9092 2003-10-14 devnull if(t == nil)
55 3d7e9092 2003-10-14 devnull return s;
56 3d7e9092 2003-10-14 devnull return strcpy(s, t) + strlen(t);
57 3d7e9092 2003-10-14 devnull }
58 3d7e9092 2003-10-14 devnull
59 3d7e9092 2003-10-14 devnull /* quote attribute value, if necessary */
60 3d7e9092 2003-10-14 devnull static char*
61 3d7e9092 2003-10-14 devnull quote(char *s)
62 3d7e9092 2003-10-14 devnull {
63 3d7e9092 2003-10-14 devnull char *t;
64 3d7e9092 2003-10-14 devnull int c;
65 3d7e9092 2003-10-14 devnull
66 3d7e9092 2003-10-14 devnull if(s == nil){
67 3d7e9092 2003-10-14 devnull attrbuf[0] = '\0';
68 3d7e9092 2003-10-14 devnull return attrbuf;
69 3d7e9092 2003-10-14 devnull }
70 3d7e9092 2003-10-14 devnull if(strpbrk(s, " '=\t") == nil)
71 3d7e9092 2003-10-14 devnull return s;
72 3d7e9092 2003-10-14 devnull t = attrbuf;
73 3d7e9092 2003-10-14 devnull *t++ = '\'';
74 3d7e9092 2003-10-14 devnull while(t < attrbuf+sizeof attrbuf-2){
75 3d7e9092 2003-10-14 devnull c = *s++;
76 3d7e9092 2003-10-14 devnull if(c == '\0')
77 3d7e9092 2003-10-14 devnull break;
78 3d7e9092 2003-10-14 devnull *t++ = c;
79 3d7e9092 2003-10-14 devnull if(c == '\'')
80 3d7e9092 2003-10-14 devnull *t++ = c;
81 3d7e9092 2003-10-14 devnull }
82 3d7e9092 2003-10-14 devnull *t++ = '\'';
83 3d7e9092 2003-10-14 devnull *t = '\0';
84 3d7e9092 2003-10-14 devnull return attrbuf;
85 3d7e9092 2003-10-14 devnull }
86 3d7e9092 2003-10-14 devnull
87 3d7e9092 2003-10-14 devnull char*
88 3d7e9092 2003-10-14 devnull plumbpackattr(Plumbattr *attr)
89 3d7e9092 2003-10-14 devnull {
90 3d7e9092 2003-10-14 devnull int n;
91 3d7e9092 2003-10-14 devnull Plumbattr *a;
92 3d7e9092 2003-10-14 devnull char *s, *t;
93 3d7e9092 2003-10-14 devnull
94 3d7e9092 2003-10-14 devnull if(attr == nil)
95 3d7e9092 2003-10-14 devnull return nil;
96 3d7e9092 2003-10-14 devnull n = 0;
97 3d7e9092 2003-10-14 devnull for(a=attr; a!=nil; a=a->next)
98 3d7e9092 2003-10-14 devnull n += Strlen(a->name) + 1 + Strlen(quote(a->value)) + 1;
99 3d7e9092 2003-10-14 devnull s = malloc(n);
100 3d7e9092 2003-10-14 devnull if(s == nil)
101 3d7e9092 2003-10-14 devnull return nil;
102 3d7e9092 2003-10-14 devnull t = s;
103 3d7e9092 2003-10-14 devnull *t = '\0';
104 3d7e9092 2003-10-14 devnull for(a=attr; a!=nil; a=a->next){
105 3d7e9092 2003-10-14 devnull if(t != s)
106 3d7e9092 2003-10-14 devnull *t++ = ' ';
107 3d7e9092 2003-10-14 devnull strcpy(t, a->name);
108 3d7e9092 2003-10-14 devnull strcat(t, "=");
109 3d7e9092 2003-10-14 devnull strcat(t, quote(a->value));
110 3d7e9092 2003-10-14 devnull t += strlen(t);
111 3d7e9092 2003-10-14 devnull }
112 3d7e9092 2003-10-14 devnull if(t > s+n)
113 3d7e9092 2003-10-14 devnull abort();
114 3d7e9092 2003-10-14 devnull return s;
115 3d7e9092 2003-10-14 devnull }
116 3d7e9092 2003-10-14 devnull
117 3d7e9092 2003-10-14 devnull char*
118 3d7e9092 2003-10-14 devnull plumblookup(Plumbattr *attr, char *name)
119 3d7e9092 2003-10-14 devnull {
120 3d7e9092 2003-10-14 devnull while(attr){
121 3d7e9092 2003-10-14 devnull if(strcmp(attr->name, name) == 0)
122 3d7e9092 2003-10-14 devnull return attr->value;
123 3d7e9092 2003-10-14 devnull attr = attr->next;
124 3d7e9092 2003-10-14 devnull }
125 3d7e9092 2003-10-14 devnull return nil;
126 3d7e9092 2003-10-14 devnull }
127 3d7e9092 2003-10-14 devnull
128 3d7e9092 2003-10-14 devnull char*
129 3d7e9092 2003-10-14 devnull plumbpack(Plumbmsg *m, int *np)
130 3d7e9092 2003-10-14 devnull {
131 3d7e9092 2003-10-14 devnull int n, ndata;
132 3d7e9092 2003-10-14 devnull char *buf, *p, *attr;
133 3d7e9092 2003-10-14 devnull
134 3d7e9092 2003-10-14 devnull ndata = m->ndata;
135 3d7e9092 2003-10-14 devnull if(ndata < 0)
136 3d7e9092 2003-10-14 devnull ndata = Strlen(m->data);
137 3d7e9092 2003-10-14 devnull attr = plumbpackattr(m->attr);
138 3d7e9092 2003-10-14 devnull n = Strlen(m->src)+1 + Strlen(m->dst)+1 + Strlen(m->wdir)+1 +
139 3d7e9092 2003-10-14 devnull Strlen(m->type)+1 + Strlen(attr)+1 + 16 + ndata;
140 3d7e9092 2003-10-14 devnull buf = malloc(n+1); /* +1 for '\0' */
141 3d7e9092 2003-10-14 devnull if(buf == nil){
142 3d7e9092 2003-10-14 devnull free(attr);
143 3d7e9092 2003-10-14 devnull return nil;
144 3d7e9092 2003-10-14 devnull }
145 3d7e9092 2003-10-14 devnull p = Strcpy(buf, m->src);
146 3d7e9092 2003-10-14 devnull *p++ = '\n';
147 3d7e9092 2003-10-14 devnull p = Strcpy(p, m->dst);
148 3d7e9092 2003-10-14 devnull *p++ = '\n';
149 3d7e9092 2003-10-14 devnull p = Strcpy(p, m->wdir);
150 3d7e9092 2003-10-14 devnull *p++ = '\n';
151 3d7e9092 2003-10-14 devnull p = Strcpy(p, m->type);
152 3d7e9092 2003-10-14 devnull *p++ = '\n';
153 3d7e9092 2003-10-14 devnull p = Strcpy(p, attr);
154 3d7e9092 2003-10-14 devnull *p++ = '\n';
155 3d7e9092 2003-10-14 devnull p += sprint(p, "%d\n", ndata);
156 3d7e9092 2003-10-14 devnull memmove(p, m->data, ndata);
157 3d7e9092 2003-10-14 devnull *np = (p-buf)+ndata;
158 3d7e9092 2003-10-14 devnull buf[*np] = '\0'; /* null terminate just in case */
159 3d7e9092 2003-10-14 devnull if(*np >= n+1)
160 3d7e9092 2003-10-14 devnull abort();
161 3d7e9092 2003-10-14 devnull free(attr);
162 3d7e9092 2003-10-14 devnull return buf;
163 3d7e9092 2003-10-14 devnull }
164 3d7e9092 2003-10-14 devnull
165 3d7e9092 2003-10-14 devnull int
166 3d7e9092 2003-10-14 devnull plumbsend(int fd, Plumbmsg *m)
167 3d7e9092 2003-10-14 devnull {
168 3d7e9092 2003-10-14 devnull char *buf;
169 3d7e9092 2003-10-14 devnull int n;
170 3d7e9092 2003-10-14 devnull
171 3d7e9092 2003-10-14 devnull buf = plumbpack(m, &n);
172 3d7e9092 2003-10-14 devnull if(buf == nil)
173 3d7e9092 2003-10-14 devnull return -1;
174 3d7e9092 2003-10-14 devnull n = write(fd, buf, n);
175 3d7e9092 2003-10-14 devnull free(buf);
176 3d7e9092 2003-10-14 devnull return n;
177 3d7e9092 2003-10-14 devnull }
178 3d7e9092 2003-10-14 devnull
179 3d7e9092 2003-10-14 devnull static int
180 3d7e9092 2003-10-14 devnull plumbline(char **linep, char *buf, int i, int n, int *bad)
181 3d7e9092 2003-10-14 devnull {
182 3d7e9092 2003-10-14 devnull int starti;
183 3d7e9092 2003-10-14 devnull char *p;
184 3d7e9092 2003-10-14 devnull
185 3d7e9092 2003-10-14 devnull if(*bad)
186 3d7e9092 2003-10-14 devnull return i;
187 3d7e9092 2003-10-14 devnull starti = i;
188 3d7e9092 2003-10-14 devnull while(i<n && buf[i]!='\n')
189 3d7e9092 2003-10-14 devnull i++;
190 3d7e9092 2003-10-14 devnull if(i == n)
191 3d7e9092 2003-10-14 devnull *bad = 1;
192 3d7e9092 2003-10-14 devnull else{
193 3d7e9092 2003-10-14 devnull p = malloc((i-starti) + 1);
194 3d7e9092 2003-10-14 devnull if(p == nil)
195 3d7e9092 2003-10-14 devnull *bad = 1;
196 3d7e9092 2003-10-14 devnull else{
197 3d7e9092 2003-10-14 devnull memmove(p, buf+starti, i-starti);
198 3d7e9092 2003-10-14 devnull p[i-starti] = '\0';
199 3d7e9092 2003-10-14 devnull }
200 3d7e9092 2003-10-14 devnull *linep = p;
201 3d7e9092 2003-10-14 devnull i++;
202 3d7e9092 2003-10-14 devnull }
203 3d7e9092 2003-10-14 devnull return i;
204 3d7e9092 2003-10-14 devnull }
205 3d7e9092 2003-10-14 devnull
206 3d7e9092 2003-10-14 devnull void
207 3d7e9092 2003-10-14 devnull plumbfree(Plumbmsg *m)
208 3d7e9092 2003-10-14 devnull {
209 3d7e9092 2003-10-14 devnull Plumbattr *a, *next;
210 3d7e9092 2003-10-14 devnull
211 3d7e9092 2003-10-14 devnull free(m->src);
212 3d7e9092 2003-10-14 devnull free(m->dst);
213 3d7e9092 2003-10-14 devnull free(m->wdir);
214 3d7e9092 2003-10-14 devnull free(m->type);
215 3d7e9092 2003-10-14 devnull for(a=m->attr; a!=nil; a=next){
216 3d7e9092 2003-10-14 devnull next = a->next;
217 3d7e9092 2003-10-14 devnull free(a->name);
218 3d7e9092 2003-10-14 devnull free(a->value);
219 3d7e9092 2003-10-14 devnull free(a);
220 3d7e9092 2003-10-14 devnull }
221 3d7e9092 2003-10-14 devnull free(m->data);
222 3d7e9092 2003-10-14 devnull free(m);
223 3d7e9092 2003-10-14 devnull }
224 3d7e9092 2003-10-14 devnull
225 3d7e9092 2003-10-14 devnull Plumbattr*
226 3d7e9092 2003-10-14 devnull plumbunpackattr(char *p)
227 3d7e9092 2003-10-14 devnull {
228 3d7e9092 2003-10-14 devnull Plumbattr *attr, *prev, *a;
229 3d7e9092 2003-10-14 devnull char *q, *v;
230 3d7e9092 2003-10-14 devnull int c, quoting;
231 3d7e9092 2003-10-14 devnull
232 3d7e9092 2003-10-14 devnull attr = prev = nil;
233 3d7e9092 2003-10-14 devnull while(*p!='\0' && *p!='\n'){
234 3d7e9092 2003-10-14 devnull while(*p==' ' || *p=='\t')
235 3d7e9092 2003-10-14 devnull p++;
236 3d7e9092 2003-10-14 devnull if(*p == '\0')
237 3d7e9092 2003-10-14 devnull break;
238 3d7e9092 2003-10-14 devnull for(q=p; *q!='\0' && *q!='\n' && *q!=' ' && *q!='\t'; q++)
239 3d7e9092 2003-10-14 devnull if(*q == '=')
240 3d7e9092 2003-10-14 devnull break;
241 3d7e9092 2003-10-14 devnull if(*q != '=')
242 3d7e9092 2003-10-14 devnull break; /* malformed attribute */
243 3d7e9092 2003-10-14 devnull a = malloc(sizeof(Plumbattr));
244 3d7e9092 2003-10-14 devnull if(a == nil)
245 3d7e9092 2003-10-14 devnull break;
246 3d7e9092 2003-10-14 devnull a->name = malloc(q-p+1);
247 3d7e9092 2003-10-14 devnull if(a->name == nil){
248 3d7e9092 2003-10-14 devnull free(a);
249 3d7e9092 2003-10-14 devnull break;
250 3d7e9092 2003-10-14 devnull }
251 3d7e9092 2003-10-14 devnull memmove(a->name, p, q-p);
252 3d7e9092 2003-10-14 devnull a->name[q-p] = '\0';
253 3d7e9092 2003-10-14 devnull /* process quotes in value */
254 3d7e9092 2003-10-14 devnull q++; /* skip '=' */
255 3d7e9092 2003-10-14 devnull v = attrbuf;
256 3d7e9092 2003-10-14 devnull quoting = 0;
257 3d7e9092 2003-10-14 devnull while(*q!='\0' && *q!='\n'){
258 3d7e9092 2003-10-14 devnull if(v >= attrbuf+sizeof attrbuf)
259 3d7e9092 2003-10-14 devnull break;
260 3d7e9092 2003-10-14 devnull c = *q++;
261 3d7e9092 2003-10-14 devnull if(quoting){
262 3d7e9092 2003-10-14 devnull if(c == '\''){
263 3d7e9092 2003-10-14 devnull if(*q == '\'')
264 3d7e9092 2003-10-14 devnull q++;
265 3d7e9092 2003-10-14 devnull else{
266 3d7e9092 2003-10-14 devnull quoting = 0;
267 3d7e9092 2003-10-14 devnull continue;
268 3d7e9092 2003-10-14 devnull }
269 3d7e9092 2003-10-14 devnull }
270 3d7e9092 2003-10-14 devnull }else{
271 3d7e9092 2003-10-14 devnull if(c==' ' || c=='\t')
272 3d7e9092 2003-10-14 devnull break;
273 3d7e9092 2003-10-14 devnull if(c == '\''){
274 3d7e9092 2003-10-14 devnull quoting = 1;
275 3d7e9092 2003-10-14 devnull continue;
276 3d7e9092 2003-10-14 devnull }
277 3d7e9092 2003-10-14 devnull }
278 3d7e9092 2003-10-14 devnull *v++ = c;
279 3d7e9092 2003-10-14 devnull }
280 3d7e9092 2003-10-14 devnull a->value = malloc(v-attrbuf+1);
281 3d7e9092 2003-10-14 devnull if(a->value == nil){
282 3d7e9092 2003-10-14 devnull free(a->name);
283 3d7e9092 2003-10-14 devnull free(a);
284 3d7e9092 2003-10-14 devnull break;
285 3d7e9092 2003-10-14 devnull }
286 3d7e9092 2003-10-14 devnull memmove(a->value, attrbuf, v-attrbuf);
287 3d7e9092 2003-10-14 devnull a->value[v-attrbuf] = '\0';
288 3d7e9092 2003-10-14 devnull a->next = nil;
289 3d7e9092 2003-10-14 devnull if(prev == nil)
290 3d7e9092 2003-10-14 devnull attr = a;
291 3d7e9092 2003-10-14 devnull else
292 3d7e9092 2003-10-14 devnull prev->next = a;
293 3d7e9092 2003-10-14 devnull prev = a;
294 3d7e9092 2003-10-14 devnull p = q;
295 3d7e9092 2003-10-14 devnull }
296 3d7e9092 2003-10-14 devnull return attr;
297 3d7e9092 2003-10-14 devnull }
298 3d7e9092 2003-10-14 devnull
299 3d7e9092 2003-10-14 devnull Plumbattr*
300 3d7e9092 2003-10-14 devnull plumbaddattr(Plumbattr *attr, Plumbattr *new)
301 3d7e9092 2003-10-14 devnull {
302 3d7e9092 2003-10-14 devnull Plumbattr *l;
303 3d7e9092 2003-10-14 devnull
304 3d7e9092 2003-10-14 devnull l = attr;
305 3d7e9092 2003-10-14 devnull if(l == nil)
306 3d7e9092 2003-10-14 devnull return new;
307 3d7e9092 2003-10-14 devnull while(l->next != nil)
308 3d7e9092 2003-10-14 devnull l = l->next;
309 3d7e9092 2003-10-14 devnull l->next = new;
310 3d7e9092 2003-10-14 devnull return attr;
311 3d7e9092 2003-10-14 devnull }
312 3d7e9092 2003-10-14 devnull
313 3d7e9092 2003-10-14 devnull Plumbattr*
314 3d7e9092 2003-10-14 devnull plumbdelattr(Plumbattr *attr, char *name)
315 3d7e9092 2003-10-14 devnull {
316 3d7e9092 2003-10-14 devnull Plumbattr *l, *prev;
317 3d7e9092 2003-10-14 devnull
318 3d7e9092 2003-10-14 devnull prev = nil;
319 3d7e9092 2003-10-14 devnull for(l=attr; l!=nil; l=l->next){
320 3d7e9092 2003-10-14 devnull if(strcmp(name, l->name) == 0)
321 3d7e9092 2003-10-14 devnull break;
322 3d7e9092 2003-10-14 devnull prev = l;
323 3d7e9092 2003-10-14 devnull }
324 3d7e9092 2003-10-14 devnull if(l == nil)
325 3d7e9092 2003-10-14 devnull return nil;
326 3d7e9092 2003-10-14 devnull if(prev)
327 3d7e9092 2003-10-14 devnull prev->next = l->next;
328 3d7e9092 2003-10-14 devnull else
329 3d7e9092 2003-10-14 devnull attr = l->next;
330 3d7e9092 2003-10-14 devnull free(l->name);
331 3d7e9092 2003-10-14 devnull free(l->value);
332 3d7e9092 2003-10-14 devnull free(l);
333 3d7e9092 2003-10-14 devnull return attr;
334 3d7e9092 2003-10-14 devnull }
335 3d7e9092 2003-10-14 devnull
336 3d7e9092 2003-10-14 devnull Plumbmsg*
337 3d7e9092 2003-10-14 devnull plumbunpackpartial(char *buf, int n, int *morep)
338 3d7e9092 2003-10-14 devnull {
339 3d7e9092 2003-10-14 devnull Plumbmsg *m;
340 3d7e9092 2003-10-14 devnull int i, bad;
341 3d7e9092 2003-10-14 devnull char *ntext, *attr;
342 3d7e9092 2003-10-14 devnull
343 3d7e9092 2003-10-14 devnull m = malloc(sizeof(Plumbmsg));
344 3d7e9092 2003-10-14 devnull if(m == nil)
345 3d7e9092 2003-10-14 devnull return nil;
346 3d7e9092 2003-10-14 devnull memset(m, 0, sizeof(Plumbmsg));
347 3d7e9092 2003-10-14 devnull if(morep != nil)
348 3d7e9092 2003-10-14 devnull *morep = 0;
349 3d7e9092 2003-10-14 devnull bad = 0;
350 3d7e9092 2003-10-14 devnull i = plumbline(&m->src, buf, 0, n, &bad);
351 3d7e9092 2003-10-14 devnull i = plumbline(&m->dst, buf, i, n, &bad);
352 3d7e9092 2003-10-14 devnull i = plumbline(&m->wdir, buf, i, n, &bad);
353 3d7e9092 2003-10-14 devnull i = plumbline(&m->type, buf, i, n, &bad);
354 3d7e9092 2003-10-14 devnull i = plumbline(&attr, buf, i, n, &bad);
355 3d7e9092 2003-10-14 devnull m->attr = plumbunpackattr(attr);
356 3d7e9092 2003-10-14 devnull free(attr);
357 3d7e9092 2003-10-14 devnull i = plumbline(&ntext, buf, i, n, &bad);
358 3d7e9092 2003-10-14 devnull m->ndata = atoi(ntext);
359 3d7e9092 2003-10-14 devnull if(m->ndata != n-i){
360 3d7e9092 2003-10-14 devnull bad = 1;
361 3d7e9092 2003-10-14 devnull if(morep!=nil && m->ndata>n-i)
362 3d7e9092 2003-10-14 devnull *morep = m->ndata - (n-i);
363 3d7e9092 2003-10-14 devnull }
364 3d7e9092 2003-10-14 devnull free(ntext);
365 3d7e9092 2003-10-14 devnull if(!bad){
366 3d7e9092 2003-10-14 devnull m->data = malloc(n-i+1); /* +1 for '\0' */
367 3d7e9092 2003-10-14 devnull if(m->data == nil)
368 3d7e9092 2003-10-14 devnull bad = 1;
369 3d7e9092 2003-10-14 devnull else{
370 3d7e9092 2003-10-14 devnull memmove(m->data, buf+i, m->ndata);
371 3d7e9092 2003-10-14 devnull m->ndata = n-i;
372 3d7e9092 2003-10-14 devnull /* null-terminate in case it's text */
373 3d7e9092 2003-10-14 devnull m->data[m->ndata] = '\0';
374 3d7e9092 2003-10-14 devnull }
375 3d7e9092 2003-10-14 devnull }
376 3d7e9092 2003-10-14 devnull if(bad){
377 3d7e9092 2003-10-14 devnull plumbfree(m);
378 3d7e9092 2003-10-14 devnull m = nil;
379 3d7e9092 2003-10-14 devnull }
380 3d7e9092 2003-10-14 devnull return m;
381 3d7e9092 2003-10-14 devnull }
382 3d7e9092 2003-10-14 devnull
383 3d7e9092 2003-10-14 devnull Plumbmsg*
384 3d7e9092 2003-10-14 devnull plumbunpack(char *buf, int n)
385 3d7e9092 2003-10-14 devnull {
386 3d7e9092 2003-10-14 devnull return plumbunpackpartial(buf, n, nil);
387 3d7e9092 2003-10-14 devnull }
388 3d7e9092 2003-10-14 devnull
389 3d7e9092 2003-10-14 devnull Plumbmsg*
390 3d7e9092 2003-10-14 devnull plumbrecv(int fd)
391 3d7e9092 2003-10-14 devnull {
392 3d7e9092 2003-10-14 devnull char *buf;
393 3d7e9092 2003-10-14 devnull Plumbmsg *m;
394 3d7e9092 2003-10-14 devnull int n, more;
395 3d7e9092 2003-10-14 devnull
396 3d7e9092 2003-10-14 devnull buf = malloc(8192);
397 3d7e9092 2003-10-14 devnull if(buf == nil)
398 3d7e9092 2003-10-14 devnull return nil;
399 3d7e9092 2003-10-14 devnull n = read(fd, buf, 8192);
400 3d7e9092 2003-10-14 devnull m = nil;
401 3d7e9092 2003-10-14 devnull if(n > 0){
402 3d7e9092 2003-10-14 devnull m = plumbunpackpartial(buf, n, &more);
403 3d7e9092 2003-10-14 devnull if(m==nil && more>0){
404 3d7e9092 2003-10-14 devnull /* we now know how many more bytes to read for complete message */
405 3d7e9092 2003-10-14 devnull buf = realloc(buf, n+more);
406 3d7e9092 2003-10-14 devnull if(buf == nil)
407 3d7e9092 2003-10-14 devnull return nil;
408 3d7e9092 2003-10-14 devnull if(readn(fd, buf+n, more) == more)
409 3d7e9092 2003-10-14 devnull m = plumbunpackpartial(buf, n+more, nil);
410 3d7e9092 2003-10-14 devnull }
411 3d7e9092 2003-10-14 devnull }
412 3d7e9092 2003-10-14 devnull free(buf);
413 3d7e9092 2003-10-14 devnull return m;
414 3d7e9092 2003-10-14 devnull }