Blame


1 3d7e9092 2003-10-14 devnull #include <u.h>
2 3d7e9092 2003-10-14 devnull #include <libc.h>
3 32f69c36 2003-12-11 devnull #include <fcall.h>
4 32f69c36 2003-12-11 devnull #include <fs.h>
5 3d7e9092 2003-10-14 devnull #include "plumb.h"
6 3d7e9092 2003-10-14 devnull
7 3d7e9092 2003-10-14 devnull static char attrbuf[4096];
8 3d7e9092 2003-10-14 devnull
9 b7e6f415 2003-11-23 devnull char *home;
10 49588d5d 2003-12-17 devnull static Fsys *fsplumb;
11 49588d5d 2003-12-17 devnull static int pfd = -1;
12 49588d5d 2003-12-17 devnull static Fid *pfid;
13 3d7e9092 2003-10-14 devnull int
14 3d7e9092 2003-10-14 devnull plumbopen(char *name, int omode)
15 3d7e9092 2003-10-14 devnull {
16 49588d5d 2003-12-17 devnull if(fsplumb == nil)
17 49588d5d 2003-12-17 devnull fsplumb = nsmount("plumb", "");
18 49588d5d 2003-12-17 devnull if(fsplumb == nil)
19 3d7e9092 2003-10-14 devnull return -1;
20 49588d5d 2003-12-17 devnull /*
21 49588d5d 2003-12-17 devnull * It's important that when we send something,
22 49588d5d 2003-12-17 devnull * we find out whether it was a valid plumb write.
23 49588d5d 2003-12-17 devnull * (If it isn't, the client might fall back to some
24 49588d5d 2003-12-17 devnull * other mechanism or indicate to the user what happened.)
25 49588d5d 2003-12-17 devnull * We can't use a pipe for this, so we have to use the
26 49588d5d 2003-12-17 devnull * fid interface. But we need to return a fd.
27 49588d5d 2003-12-17 devnull * Return a fd for /dev/null so that we return a unique
28 49588d5d 2003-12-17 devnull * file descriptor. In plumbsend we'll look for pfd
29 49588d5d 2003-12-17 devnull * and use the recorded fid instead.
30 49588d5d 2003-12-17 devnull */
31 49588d5d 2003-12-17 devnull if((omode&3) == OWRITE){
32 49588d5d 2003-12-17 devnull if(pfd != -1){
33 49588d5d 2003-12-17 devnull werrstr("already have plumb send open");
34 49588d5d 2003-12-17 devnull return -1;
35 49588d5d 2003-12-17 devnull }
36 49588d5d 2003-12-17 devnull pfd = open("/dev/null", OWRITE);
37 49588d5d 2003-12-17 devnull if(pfd < 0)
38 49588d5d 2003-12-17 devnull return -1;
39 49588d5d 2003-12-17 devnull pfid = fsopen(fsplumb, name, omode);
40 49588d5d 2003-12-17 devnull if(pfid == nil){
41 49588d5d 2003-12-17 devnull close(pfd);
42 49588d5d 2003-12-17 devnull pfd = -1;
43 49588d5d 2003-12-17 devnull return -1;
44 49588d5d 2003-12-17 devnull }
45 49588d5d 2003-12-17 devnull return pfd;
46 49588d5d 2003-12-17 devnull }
47 49588d5d 2003-12-17 devnull
48 2277c5d7 2004-03-21 devnull return fsopenfd(fsplumb, name, omode);
49 49588d5d 2003-12-17 devnull }
50 49588d5d 2003-12-17 devnull
51 2277c5d7 2004-03-21 devnull Fid*
52 2277c5d7 2004-03-21 devnull plumbopenfid(char *name, int mode)
53 2277c5d7 2004-03-21 devnull {
54 2277c5d7 2004-03-21 devnull if(fsplumb == nil)
55 2277c5d7 2004-03-21 devnull fsplumb = nsmount("plumb", "");
56 2277c5d7 2004-03-21 devnull if(fsplumb == nil)
57 2277c5d7 2004-03-21 devnull return nil;
58 2277c5d7 2004-03-21 devnull return fsopen(fsplumb, name, mode);
59 2277c5d7 2004-03-21 devnull }
60 2277c5d7 2004-03-21 devnull
61 49588d5d 2003-12-17 devnull int
62 2277c5d7 2004-03-21 devnull plumbsendtofid(Fid *fid, Plumbmsg *m)
63 49588d5d 2003-12-17 devnull {
64 49588d5d 2003-12-17 devnull char *buf;
65 49588d5d 2003-12-17 devnull int n;
66 49588d5d 2003-12-17 devnull
67 49588d5d 2003-12-17 devnull buf = plumbpack(m, &n);
68 49588d5d 2003-12-17 devnull if(buf == nil)
69 49588d5d 2003-12-17 devnull return -1;
70 2277c5d7 2004-03-21 devnull n = fswrite(fid, buf, n);
71 49588d5d 2003-12-17 devnull free(buf);
72 49588d5d 2003-12-17 devnull return n;
73 2277c5d7 2004-03-21 devnull }
74 2277c5d7 2004-03-21 devnull
75 2277c5d7 2004-03-21 devnull int
76 2277c5d7 2004-03-21 devnull plumbsend(int fd, Plumbmsg *m)
77 2277c5d7 2004-03-21 devnull {
78 2277c5d7 2004-03-21 devnull if(fd != pfd){
79 2277c5d7 2004-03-21 devnull werrstr("fd is not the plumber");
80 2277c5d7 2004-03-21 devnull return -1;
81 2277c5d7 2004-03-21 devnull }
82 2277c5d7 2004-03-21 devnull return plumbsendtofid(pfid, m);
83 3d7e9092 2003-10-14 devnull }
84 3d7e9092 2003-10-14 devnull
85 3d7e9092 2003-10-14 devnull static int
86 3d7e9092 2003-10-14 devnull Strlen(char *s)
87 3d7e9092 2003-10-14 devnull {
88 3d7e9092 2003-10-14 devnull if(s == nil)
89 3d7e9092 2003-10-14 devnull return 0;
90 3d7e9092 2003-10-14 devnull return strlen(s);
91 3d7e9092 2003-10-14 devnull }
92 3d7e9092 2003-10-14 devnull
93 3d7e9092 2003-10-14 devnull static char*
94 3d7e9092 2003-10-14 devnull Strcpy(char *s, char *t)
95 3d7e9092 2003-10-14 devnull {
96 3d7e9092 2003-10-14 devnull if(t == nil)
97 3d7e9092 2003-10-14 devnull return s;
98 3d7e9092 2003-10-14 devnull return strcpy(s, t) + strlen(t);
99 3d7e9092 2003-10-14 devnull }
100 3d7e9092 2003-10-14 devnull
101 3d7e9092 2003-10-14 devnull /* quote attribute value, if necessary */
102 3d7e9092 2003-10-14 devnull static char*
103 3d7e9092 2003-10-14 devnull quote(char *s)
104 3d7e9092 2003-10-14 devnull {
105 3d7e9092 2003-10-14 devnull char *t;
106 3d7e9092 2003-10-14 devnull int c;
107 3d7e9092 2003-10-14 devnull
108 3d7e9092 2003-10-14 devnull if(s == nil){
109 3d7e9092 2003-10-14 devnull attrbuf[0] = '\0';
110 3d7e9092 2003-10-14 devnull return attrbuf;
111 3d7e9092 2003-10-14 devnull }
112 3d7e9092 2003-10-14 devnull if(strpbrk(s, " '=\t") == nil)
113 3d7e9092 2003-10-14 devnull return s;
114 3d7e9092 2003-10-14 devnull t = attrbuf;
115 3d7e9092 2003-10-14 devnull *t++ = '\'';
116 3d7e9092 2003-10-14 devnull while(t < attrbuf+sizeof attrbuf-2){
117 3d7e9092 2003-10-14 devnull c = *s++;
118 3d7e9092 2003-10-14 devnull if(c == '\0')
119 3d7e9092 2003-10-14 devnull break;
120 3d7e9092 2003-10-14 devnull *t++ = c;
121 3d7e9092 2003-10-14 devnull if(c == '\'')
122 3d7e9092 2003-10-14 devnull *t++ = c;
123 3d7e9092 2003-10-14 devnull }
124 3d7e9092 2003-10-14 devnull *t++ = '\'';
125 3d7e9092 2003-10-14 devnull *t = '\0';
126 3d7e9092 2003-10-14 devnull return attrbuf;
127 3d7e9092 2003-10-14 devnull }
128 3d7e9092 2003-10-14 devnull
129 3d7e9092 2003-10-14 devnull char*
130 3d7e9092 2003-10-14 devnull plumbpackattr(Plumbattr *attr)
131 3d7e9092 2003-10-14 devnull {
132 3d7e9092 2003-10-14 devnull int n;
133 3d7e9092 2003-10-14 devnull Plumbattr *a;
134 3d7e9092 2003-10-14 devnull char *s, *t;
135 3d7e9092 2003-10-14 devnull
136 3d7e9092 2003-10-14 devnull if(attr == nil)
137 3d7e9092 2003-10-14 devnull return nil;
138 3d7e9092 2003-10-14 devnull n = 0;
139 3d7e9092 2003-10-14 devnull for(a=attr; a!=nil; a=a->next)
140 3d7e9092 2003-10-14 devnull n += Strlen(a->name) + 1 + Strlen(quote(a->value)) + 1;
141 3d7e9092 2003-10-14 devnull s = malloc(n);
142 3d7e9092 2003-10-14 devnull if(s == nil)
143 3d7e9092 2003-10-14 devnull return nil;
144 3d7e9092 2003-10-14 devnull t = s;
145 3d7e9092 2003-10-14 devnull *t = '\0';
146 3d7e9092 2003-10-14 devnull for(a=attr; a!=nil; a=a->next){
147 3d7e9092 2003-10-14 devnull if(t != s)
148 3d7e9092 2003-10-14 devnull *t++ = ' ';
149 3d7e9092 2003-10-14 devnull strcpy(t, a->name);
150 3d7e9092 2003-10-14 devnull strcat(t, "=");
151 3d7e9092 2003-10-14 devnull strcat(t, quote(a->value));
152 3d7e9092 2003-10-14 devnull t += strlen(t);
153 3d7e9092 2003-10-14 devnull }
154 3d7e9092 2003-10-14 devnull if(t > s+n)
155 3d7e9092 2003-10-14 devnull abort();
156 3d7e9092 2003-10-14 devnull return s;
157 3d7e9092 2003-10-14 devnull }
158 3d7e9092 2003-10-14 devnull
159 3d7e9092 2003-10-14 devnull char*
160 3d7e9092 2003-10-14 devnull plumblookup(Plumbattr *attr, char *name)
161 3d7e9092 2003-10-14 devnull {
162 3d7e9092 2003-10-14 devnull while(attr){
163 3d7e9092 2003-10-14 devnull if(strcmp(attr->name, name) == 0)
164 3d7e9092 2003-10-14 devnull return attr->value;
165 3d7e9092 2003-10-14 devnull attr = attr->next;
166 3d7e9092 2003-10-14 devnull }
167 3d7e9092 2003-10-14 devnull return nil;
168 3d7e9092 2003-10-14 devnull }
169 3d7e9092 2003-10-14 devnull
170 3d7e9092 2003-10-14 devnull char*
171 3d7e9092 2003-10-14 devnull plumbpack(Plumbmsg *m, int *np)
172 3d7e9092 2003-10-14 devnull {
173 3d7e9092 2003-10-14 devnull int n, ndata;
174 3d7e9092 2003-10-14 devnull char *buf, *p, *attr;
175 3d7e9092 2003-10-14 devnull
176 3d7e9092 2003-10-14 devnull ndata = m->ndata;
177 3d7e9092 2003-10-14 devnull if(ndata < 0)
178 3d7e9092 2003-10-14 devnull ndata = Strlen(m->data);
179 3d7e9092 2003-10-14 devnull attr = plumbpackattr(m->attr);
180 3d7e9092 2003-10-14 devnull n = Strlen(m->src)+1 + Strlen(m->dst)+1 + Strlen(m->wdir)+1 +
181 3d7e9092 2003-10-14 devnull Strlen(m->type)+1 + Strlen(attr)+1 + 16 + ndata;
182 3d7e9092 2003-10-14 devnull buf = malloc(n+1); /* +1 for '\0' */
183 3d7e9092 2003-10-14 devnull if(buf == nil){
184 3d7e9092 2003-10-14 devnull free(attr);
185 3d7e9092 2003-10-14 devnull return nil;
186 3d7e9092 2003-10-14 devnull }
187 3d7e9092 2003-10-14 devnull p = Strcpy(buf, m->src);
188 3d7e9092 2003-10-14 devnull *p++ = '\n';
189 3d7e9092 2003-10-14 devnull p = Strcpy(p, m->dst);
190 3d7e9092 2003-10-14 devnull *p++ = '\n';
191 3d7e9092 2003-10-14 devnull p = Strcpy(p, m->wdir);
192 3d7e9092 2003-10-14 devnull *p++ = '\n';
193 3d7e9092 2003-10-14 devnull p = Strcpy(p, m->type);
194 3d7e9092 2003-10-14 devnull *p++ = '\n';
195 3d7e9092 2003-10-14 devnull p = Strcpy(p, attr);
196 3d7e9092 2003-10-14 devnull *p++ = '\n';
197 3d7e9092 2003-10-14 devnull p += sprint(p, "%d\n", ndata);
198 3d7e9092 2003-10-14 devnull memmove(p, m->data, ndata);
199 3d7e9092 2003-10-14 devnull *np = (p-buf)+ndata;
200 3d7e9092 2003-10-14 devnull buf[*np] = '\0'; /* null terminate just in case */
201 3d7e9092 2003-10-14 devnull if(*np >= n+1)
202 3d7e9092 2003-10-14 devnull abort();
203 3d7e9092 2003-10-14 devnull free(attr);
204 3d7e9092 2003-10-14 devnull return buf;
205 3d7e9092 2003-10-14 devnull }
206 3d7e9092 2003-10-14 devnull
207 3d7e9092 2003-10-14 devnull static int
208 3d7e9092 2003-10-14 devnull plumbline(char **linep, char *buf, int i, int n, int *bad)
209 3d7e9092 2003-10-14 devnull {
210 3d7e9092 2003-10-14 devnull int starti;
211 3d7e9092 2003-10-14 devnull char *p;
212 3d7e9092 2003-10-14 devnull
213 3d7e9092 2003-10-14 devnull if(*bad)
214 3d7e9092 2003-10-14 devnull return i;
215 3d7e9092 2003-10-14 devnull starti = i;
216 3d7e9092 2003-10-14 devnull while(i<n && buf[i]!='\n')
217 3d7e9092 2003-10-14 devnull i++;
218 3d7e9092 2003-10-14 devnull if(i == n)
219 3d7e9092 2003-10-14 devnull *bad = 1;
220 3d7e9092 2003-10-14 devnull else{
221 3d7e9092 2003-10-14 devnull p = malloc((i-starti) + 1);
222 3d7e9092 2003-10-14 devnull if(p == nil)
223 3d7e9092 2003-10-14 devnull *bad = 1;
224 3d7e9092 2003-10-14 devnull else{
225 3d7e9092 2003-10-14 devnull memmove(p, buf+starti, i-starti);
226 3d7e9092 2003-10-14 devnull p[i-starti] = '\0';
227 3d7e9092 2003-10-14 devnull }
228 3d7e9092 2003-10-14 devnull *linep = p;
229 3d7e9092 2003-10-14 devnull i++;
230 3d7e9092 2003-10-14 devnull }
231 3d7e9092 2003-10-14 devnull return i;
232 3d7e9092 2003-10-14 devnull }
233 3d7e9092 2003-10-14 devnull
234 3d7e9092 2003-10-14 devnull void
235 3d7e9092 2003-10-14 devnull plumbfree(Plumbmsg *m)
236 3d7e9092 2003-10-14 devnull {
237 3d7e9092 2003-10-14 devnull Plumbattr *a, *next;
238 3d7e9092 2003-10-14 devnull
239 3d7e9092 2003-10-14 devnull free(m->src);
240 3d7e9092 2003-10-14 devnull free(m->dst);
241 3d7e9092 2003-10-14 devnull free(m->wdir);
242 3d7e9092 2003-10-14 devnull free(m->type);
243 3d7e9092 2003-10-14 devnull for(a=m->attr; a!=nil; a=next){
244 3d7e9092 2003-10-14 devnull next = a->next;
245 3d7e9092 2003-10-14 devnull free(a->name);
246 3d7e9092 2003-10-14 devnull free(a->value);
247 3d7e9092 2003-10-14 devnull free(a);
248 3d7e9092 2003-10-14 devnull }
249 3d7e9092 2003-10-14 devnull free(m->data);
250 3d7e9092 2003-10-14 devnull free(m);
251 3d7e9092 2003-10-14 devnull }
252 3d7e9092 2003-10-14 devnull
253 3d7e9092 2003-10-14 devnull Plumbattr*
254 3d7e9092 2003-10-14 devnull plumbunpackattr(char *p)
255 3d7e9092 2003-10-14 devnull {
256 3d7e9092 2003-10-14 devnull Plumbattr *attr, *prev, *a;
257 3d7e9092 2003-10-14 devnull char *q, *v;
258 3d7e9092 2003-10-14 devnull int c, quoting;
259 3d7e9092 2003-10-14 devnull
260 3d7e9092 2003-10-14 devnull attr = prev = nil;
261 3d7e9092 2003-10-14 devnull while(*p!='\0' && *p!='\n'){
262 3d7e9092 2003-10-14 devnull while(*p==' ' || *p=='\t')
263 3d7e9092 2003-10-14 devnull p++;
264 3d7e9092 2003-10-14 devnull if(*p == '\0')
265 3d7e9092 2003-10-14 devnull break;
266 3d7e9092 2003-10-14 devnull for(q=p; *q!='\0' && *q!='\n' && *q!=' ' && *q!='\t'; q++)
267 3d7e9092 2003-10-14 devnull if(*q == '=')
268 3d7e9092 2003-10-14 devnull break;
269 3d7e9092 2003-10-14 devnull if(*q != '=')
270 3d7e9092 2003-10-14 devnull break; /* malformed attribute */
271 3d7e9092 2003-10-14 devnull a = malloc(sizeof(Plumbattr));
272 3d7e9092 2003-10-14 devnull if(a == nil)
273 3d7e9092 2003-10-14 devnull break;
274 3d7e9092 2003-10-14 devnull a->name = malloc(q-p+1);
275 3d7e9092 2003-10-14 devnull if(a->name == nil){
276 3d7e9092 2003-10-14 devnull free(a);
277 3d7e9092 2003-10-14 devnull break;
278 3d7e9092 2003-10-14 devnull }
279 3d7e9092 2003-10-14 devnull memmove(a->name, p, q-p);
280 3d7e9092 2003-10-14 devnull a->name[q-p] = '\0';
281 3d7e9092 2003-10-14 devnull /* process quotes in value */
282 3d7e9092 2003-10-14 devnull q++; /* skip '=' */
283 3d7e9092 2003-10-14 devnull v = attrbuf;
284 3d7e9092 2003-10-14 devnull quoting = 0;
285 3d7e9092 2003-10-14 devnull while(*q!='\0' && *q!='\n'){
286 3d7e9092 2003-10-14 devnull if(v >= attrbuf+sizeof attrbuf)
287 3d7e9092 2003-10-14 devnull break;
288 3d7e9092 2003-10-14 devnull c = *q++;
289 3d7e9092 2003-10-14 devnull if(quoting){
290 3d7e9092 2003-10-14 devnull if(c == '\''){
291 3d7e9092 2003-10-14 devnull if(*q == '\'')
292 3d7e9092 2003-10-14 devnull q++;
293 3d7e9092 2003-10-14 devnull else{
294 3d7e9092 2003-10-14 devnull quoting = 0;
295 3d7e9092 2003-10-14 devnull continue;
296 3d7e9092 2003-10-14 devnull }
297 3d7e9092 2003-10-14 devnull }
298 3d7e9092 2003-10-14 devnull }else{
299 3d7e9092 2003-10-14 devnull if(c==' ' || c=='\t')
300 3d7e9092 2003-10-14 devnull break;
301 3d7e9092 2003-10-14 devnull if(c == '\''){
302 3d7e9092 2003-10-14 devnull quoting = 1;
303 3d7e9092 2003-10-14 devnull continue;
304 3d7e9092 2003-10-14 devnull }
305 3d7e9092 2003-10-14 devnull }
306 3d7e9092 2003-10-14 devnull *v++ = c;
307 3d7e9092 2003-10-14 devnull }
308 3d7e9092 2003-10-14 devnull a->value = malloc(v-attrbuf+1);
309 3d7e9092 2003-10-14 devnull if(a->value == nil){
310 3d7e9092 2003-10-14 devnull free(a->name);
311 3d7e9092 2003-10-14 devnull free(a);
312 3d7e9092 2003-10-14 devnull break;
313 3d7e9092 2003-10-14 devnull }
314 3d7e9092 2003-10-14 devnull memmove(a->value, attrbuf, v-attrbuf);
315 3d7e9092 2003-10-14 devnull a->value[v-attrbuf] = '\0';
316 3d7e9092 2003-10-14 devnull a->next = nil;
317 3d7e9092 2003-10-14 devnull if(prev == nil)
318 3d7e9092 2003-10-14 devnull attr = a;
319 3d7e9092 2003-10-14 devnull else
320 3d7e9092 2003-10-14 devnull prev->next = a;
321 3d7e9092 2003-10-14 devnull prev = a;
322 3d7e9092 2003-10-14 devnull p = q;
323 3d7e9092 2003-10-14 devnull }
324 3d7e9092 2003-10-14 devnull return attr;
325 3d7e9092 2003-10-14 devnull }
326 3d7e9092 2003-10-14 devnull
327 3d7e9092 2003-10-14 devnull Plumbattr*
328 3d7e9092 2003-10-14 devnull plumbaddattr(Plumbattr *attr, Plumbattr *new)
329 3d7e9092 2003-10-14 devnull {
330 3d7e9092 2003-10-14 devnull Plumbattr *l;
331 3d7e9092 2003-10-14 devnull
332 3d7e9092 2003-10-14 devnull l = attr;
333 3d7e9092 2003-10-14 devnull if(l == nil)
334 3d7e9092 2003-10-14 devnull return new;
335 3d7e9092 2003-10-14 devnull while(l->next != nil)
336 3d7e9092 2003-10-14 devnull l = l->next;
337 3d7e9092 2003-10-14 devnull l->next = new;
338 3d7e9092 2003-10-14 devnull return attr;
339 3d7e9092 2003-10-14 devnull }
340 3d7e9092 2003-10-14 devnull
341 3d7e9092 2003-10-14 devnull Plumbattr*
342 3d7e9092 2003-10-14 devnull plumbdelattr(Plumbattr *attr, char *name)
343 3d7e9092 2003-10-14 devnull {
344 3d7e9092 2003-10-14 devnull Plumbattr *l, *prev;
345 3d7e9092 2003-10-14 devnull
346 3d7e9092 2003-10-14 devnull prev = nil;
347 3d7e9092 2003-10-14 devnull for(l=attr; l!=nil; l=l->next){
348 3d7e9092 2003-10-14 devnull if(strcmp(name, l->name) == 0)
349 3d7e9092 2003-10-14 devnull break;
350 3d7e9092 2003-10-14 devnull prev = l;
351 3d7e9092 2003-10-14 devnull }
352 3d7e9092 2003-10-14 devnull if(l == nil)
353 3d7e9092 2003-10-14 devnull return nil;
354 3d7e9092 2003-10-14 devnull if(prev)
355 3d7e9092 2003-10-14 devnull prev->next = l->next;
356 3d7e9092 2003-10-14 devnull else
357 3d7e9092 2003-10-14 devnull attr = l->next;
358 3d7e9092 2003-10-14 devnull free(l->name);
359 3d7e9092 2003-10-14 devnull free(l->value);
360 3d7e9092 2003-10-14 devnull free(l);
361 3d7e9092 2003-10-14 devnull return attr;
362 3d7e9092 2003-10-14 devnull }
363 3d7e9092 2003-10-14 devnull
364 3d7e9092 2003-10-14 devnull Plumbmsg*
365 3d7e9092 2003-10-14 devnull plumbunpackpartial(char *buf, int n, int *morep)
366 3d7e9092 2003-10-14 devnull {
367 3d7e9092 2003-10-14 devnull Plumbmsg *m;
368 3d7e9092 2003-10-14 devnull int i, bad;
369 3d7e9092 2003-10-14 devnull char *ntext, *attr;
370 3d7e9092 2003-10-14 devnull
371 3d7e9092 2003-10-14 devnull m = malloc(sizeof(Plumbmsg));
372 3d7e9092 2003-10-14 devnull if(m == nil)
373 3d7e9092 2003-10-14 devnull return nil;
374 3d7e9092 2003-10-14 devnull memset(m, 0, sizeof(Plumbmsg));
375 3d7e9092 2003-10-14 devnull if(morep != nil)
376 3d7e9092 2003-10-14 devnull *morep = 0;
377 3d7e9092 2003-10-14 devnull bad = 0;
378 3d7e9092 2003-10-14 devnull i = plumbline(&m->src, buf, 0, n, &bad);
379 3d7e9092 2003-10-14 devnull i = plumbline(&m->dst, buf, i, n, &bad);
380 3d7e9092 2003-10-14 devnull i = plumbline(&m->wdir, buf, i, n, &bad);
381 3d7e9092 2003-10-14 devnull i = plumbline(&m->type, buf, i, n, &bad);
382 3d7e9092 2003-10-14 devnull i = plumbline(&attr, buf, i, n, &bad);
383 3d7e9092 2003-10-14 devnull m->attr = plumbunpackattr(attr);
384 3d7e9092 2003-10-14 devnull free(attr);
385 3d7e9092 2003-10-14 devnull i = plumbline(&ntext, buf, i, n, &bad);
386 3d7e9092 2003-10-14 devnull m->ndata = atoi(ntext);
387 3d7e9092 2003-10-14 devnull if(m->ndata != n-i){
388 3d7e9092 2003-10-14 devnull bad = 1;
389 3d7e9092 2003-10-14 devnull if(morep!=nil && m->ndata>n-i)
390 3d7e9092 2003-10-14 devnull *morep = m->ndata - (n-i);
391 3d7e9092 2003-10-14 devnull }
392 3d7e9092 2003-10-14 devnull free(ntext);
393 3d7e9092 2003-10-14 devnull if(!bad){
394 3d7e9092 2003-10-14 devnull m->data = malloc(n-i+1); /* +1 for '\0' */
395 3d7e9092 2003-10-14 devnull if(m->data == nil)
396 3d7e9092 2003-10-14 devnull bad = 1;
397 3d7e9092 2003-10-14 devnull else{
398 3d7e9092 2003-10-14 devnull memmove(m->data, buf+i, m->ndata);
399 3d7e9092 2003-10-14 devnull m->ndata = n-i;
400 3d7e9092 2003-10-14 devnull /* null-terminate in case it's text */
401 3d7e9092 2003-10-14 devnull m->data[m->ndata] = '\0';
402 3d7e9092 2003-10-14 devnull }
403 3d7e9092 2003-10-14 devnull }
404 3d7e9092 2003-10-14 devnull if(bad){
405 3d7e9092 2003-10-14 devnull plumbfree(m);
406 3d7e9092 2003-10-14 devnull m = nil;
407 3d7e9092 2003-10-14 devnull }
408 3d7e9092 2003-10-14 devnull return m;
409 3d7e9092 2003-10-14 devnull }
410 3d7e9092 2003-10-14 devnull
411 3d7e9092 2003-10-14 devnull Plumbmsg*
412 3d7e9092 2003-10-14 devnull plumbunpack(char *buf, int n)
413 3d7e9092 2003-10-14 devnull {
414 3d7e9092 2003-10-14 devnull return plumbunpackpartial(buf, n, nil);
415 3d7e9092 2003-10-14 devnull }
416 3d7e9092 2003-10-14 devnull
417 3d7e9092 2003-10-14 devnull Plumbmsg*
418 3d7e9092 2003-10-14 devnull plumbrecv(int fd)
419 3d7e9092 2003-10-14 devnull {
420 3d7e9092 2003-10-14 devnull char *buf;
421 3d7e9092 2003-10-14 devnull Plumbmsg *m;
422 3d7e9092 2003-10-14 devnull int n, more;
423 3d7e9092 2003-10-14 devnull
424 3d7e9092 2003-10-14 devnull buf = malloc(8192);
425 3d7e9092 2003-10-14 devnull if(buf == nil)
426 3d7e9092 2003-10-14 devnull return nil;
427 3d7e9092 2003-10-14 devnull n = read(fd, buf, 8192);
428 3d7e9092 2003-10-14 devnull m = nil;
429 3d7e9092 2003-10-14 devnull if(n > 0){
430 3d7e9092 2003-10-14 devnull m = plumbunpackpartial(buf, n, &more);
431 3d7e9092 2003-10-14 devnull if(m==nil && more>0){
432 3d7e9092 2003-10-14 devnull /* we now know how many more bytes to read for complete message */
433 3d7e9092 2003-10-14 devnull buf = realloc(buf, n+more);
434 3d7e9092 2003-10-14 devnull if(buf == nil)
435 3d7e9092 2003-10-14 devnull return nil;
436 3d7e9092 2003-10-14 devnull if(readn(fd, buf+n, more) == more)
437 2277c5d7 2004-03-21 devnull m = plumbunpackpartial(buf, n+more, nil);
438 2277c5d7 2004-03-21 devnull }
439 2277c5d7 2004-03-21 devnull }
440 2277c5d7 2004-03-21 devnull free(buf);
441 2277c5d7 2004-03-21 devnull return m;
442 2277c5d7 2004-03-21 devnull }
443 2277c5d7 2004-03-21 devnull
444 2277c5d7 2004-03-21 devnull Plumbmsg*
445 2277c5d7 2004-03-21 devnull plumbrecvfid(Fid *fid)
446 2277c5d7 2004-03-21 devnull {
447 2277c5d7 2004-03-21 devnull char *buf;
448 2277c5d7 2004-03-21 devnull Plumbmsg *m;
449 2277c5d7 2004-03-21 devnull int n, more;
450 2277c5d7 2004-03-21 devnull
451 2277c5d7 2004-03-21 devnull buf = malloc(8192);
452 2277c5d7 2004-03-21 devnull if(buf == nil)
453 2277c5d7 2004-03-21 devnull return nil;
454 2277c5d7 2004-03-21 devnull n = fsread(fid, buf, 8192);
455 2277c5d7 2004-03-21 devnull m = nil;
456 2277c5d7 2004-03-21 devnull if(n > 0){
457 2277c5d7 2004-03-21 devnull m = plumbunpackpartial(buf, n, &more);
458 2277c5d7 2004-03-21 devnull if(m==nil && more>0){
459 2277c5d7 2004-03-21 devnull /* we now know how many more bytes to read for complete message */
460 2277c5d7 2004-03-21 devnull buf = realloc(buf, n+more);
461 2277c5d7 2004-03-21 devnull if(buf == nil)
462 2277c5d7 2004-03-21 devnull return nil;
463 2277c5d7 2004-03-21 devnull if(fsreadn(fid, buf+n, more) == more)
464 3d7e9092 2003-10-14 devnull m = plumbunpackpartial(buf, n+more, nil);
465 3d7e9092 2003-10-14 devnull }
466 3d7e9092 2003-10-14 devnull }
467 3d7e9092 2003-10-14 devnull free(buf);
468 3d7e9092 2003-10-14 devnull return m;
469 3d7e9092 2003-10-14 devnull }
470 2277c5d7 2004-03-21 devnull