Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <fcall.h>
5 static
6 uchar*
7 pstring(uchar *p, char *s)
8 {
9 uint n;
11 if(s == nil){
12 PBIT16(p, 0);
13 p += BIT16SZ;
14 return p;
15 }
17 n = strlen(s);
18 PBIT16(p, n);
19 p += BIT16SZ;
20 memmove(p, s, n);
21 p += n;
22 return p;
23 }
25 static
26 uchar*
27 pqid(uchar *p, Qid *q)
28 {
29 PBIT8(p, q->type);
30 p += BIT8SZ;
31 PBIT32(p, q->vers);
32 p += BIT32SZ;
33 PBIT64(p, q->path);
34 p += BIT64SZ;
35 return p;
36 }
38 static
39 uint
40 stringsz(char *s)
41 {
42 if(s == nil)
43 return BIT16SZ;
45 return BIT16SZ+strlen(s);
46 }
48 uint
49 sizeS2Mu(Fcall *f, int dotu)
50 {
51 uint n;
52 int i;
54 n = 0;
55 n += BIT32SZ; /* size */
56 n += BIT8SZ; /* type */
57 n += BIT16SZ; /* tag */
59 switch(f->type)
60 {
61 default:
62 return 0;
64 case Tversion:
65 n += BIT32SZ;
66 n += stringsz(f->version);
67 break;
69 case Tflush:
70 n += BIT16SZ;
71 break;
73 case Tauth:
74 n += BIT32SZ;
75 n += stringsz(f->uname);
76 n += stringsz(f->aname);
77 if(dotu)
78 n += BIT32SZ;
79 break;
81 case Tattach:
82 n += BIT32SZ;
83 n += BIT32SZ;
84 n += stringsz(f->uname);
85 n += stringsz(f->aname);
86 if(dotu)
87 n += BIT32SZ;
88 break;
90 case Twalk:
91 n += BIT32SZ;
92 n += BIT32SZ;
93 n += BIT16SZ;
94 for(i=0; i<f->nwname; i++)
95 n += stringsz(f->wname[i]);
96 break;
98 case Topen:
99 case Topenfd:
100 n += BIT32SZ;
101 n += BIT8SZ;
102 break;
104 case Tcreate:
105 n += BIT32SZ;
106 n += stringsz(f->name);
107 n += BIT32SZ;
108 n += BIT8SZ;
109 if(dotu)
110 n += stringsz(f->extension);
111 break;
113 case Tread:
114 n += BIT32SZ;
115 n += BIT64SZ;
116 n += BIT32SZ;
117 break;
119 case Twrite:
120 n += BIT32SZ;
121 n += BIT64SZ;
122 n += BIT32SZ;
123 n += f->count;
124 break;
126 case Tclunk:
127 case Tremove:
128 n += BIT32SZ;
129 break;
131 case Tstat:
132 n += BIT32SZ;
133 break;
135 case Twstat:
136 n += BIT32SZ;
137 n += BIT16SZ;
138 n += f->nstat;
139 break;
140 /*
141 */
143 case Rversion:
144 n += BIT32SZ;
145 n += stringsz(f->version);
146 break;
148 case Rerror:
149 n += stringsz(f->ename);
150 if(dotu)
151 n += BIT32SZ;
152 break;
154 case Rflush:
155 break;
157 case Rauth:
158 n += QIDSZ;
159 break;
161 case Rattach:
162 n += QIDSZ;
163 break;
165 case Rwalk:
166 n += BIT16SZ;
167 n += f->nwqid*QIDSZ;
168 break;
170 case Ropen:
171 case Rcreate:
172 n += QIDSZ;
173 n += BIT32SZ;
174 break;
176 case Ropenfd:
177 n += QIDSZ;
178 n += BIT32SZ;
179 n += BIT32SZ;
180 break;
182 case Rread:
183 n += BIT32SZ;
184 n += f->count;
185 break;
187 case Rwrite:
188 n += BIT32SZ;
189 break;
191 case Rclunk:
192 break;
194 case Rremove:
195 break;
197 case Rstat:
198 n += BIT16SZ;
199 n += f->nstat;
200 break;
202 case Rwstat:
203 break;
205 return n;
208 uint
209 sizeS2M(Fcall *f)
211 return sizeS2Mu(f, 0);
214 uint
215 convS2Mu(Fcall *f, uchar *ap, uint nap, int dotu)
217 uchar *p;
218 uint i, size;
220 size = sizeS2Mu(f, dotu);
221 if(size == 0)
222 return 0;
223 if(size > nap)
224 return 0;
226 p = (uchar*)ap;
228 PBIT32(p, size);
229 p += BIT32SZ;
230 PBIT8(p, f->type);
231 p += BIT8SZ;
232 PBIT16(p, f->tag);
233 p += BIT16SZ;
235 switch(f->type)
237 default:
238 return 0;
240 case Tversion:
241 PBIT32(p, f->msize);
242 p += BIT32SZ;
243 p = pstring(p, f->version);
244 break;
246 case Tflush:
247 PBIT16(p, f->oldtag);
248 p += BIT16SZ;
249 break;
251 case Tauth:
252 PBIT32(p, f->afid);
253 p += BIT32SZ;
254 p = pstring(p, f->uname);
255 p = pstring(p, f->aname);
256 if(dotu){
257 f->uidnum = NOUID;
258 PBIT32(p, f->uidnum);
259 p += BIT32SZ;
261 break;
263 case Tattach:
264 PBIT32(p, f->fid);
265 p += BIT32SZ;
266 PBIT32(p, f->afid);
267 p += BIT32SZ;
268 p = pstring(p, f->uname);
269 p = pstring(p, f->aname);
270 if(dotu){
271 f->uidnum = NOUID;
272 PBIT32(p, f->uidnum);
273 p += BIT32SZ;
275 break;
277 case Twalk:
278 PBIT32(p, f->fid);
279 p += BIT32SZ;
280 PBIT32(p, f->newfid);
281 p += BIT32SZ;
282 PBIT16(p, f->nwname);
283 p += BIT16SZ;
284 if(f->nwname > MAXWELEM)
285 return 0;
286 for(i=0; i<f->nwname; i++)
287 p = pstring(p, f->wname[i]);
288 break;
290 case Topen:
291 case Topenfd:
292 PBIT32(p, f->fid);
293 p += BIT32SZ;
294 PBIT8(p, f->mode);
295 p += BIT8SZ;
296 break;
298 case Tcreate:
299 PBIT32(p, f->fid);
300 p += BIT32SZ;
301 p = pstring(p, f->name);
302 PBIT32(p, f->perm);
303 p += BIT32SZ;
304 PBIT8(p, f->mode);
305 p += BIT8SZ;
306 if(dotu)
307 p = pstring(p, f->extension);
308 break;
310 case Tread:
311 PBIT32(p, f->fid);
312 p += BIT32SZ;
313 PBIT64(p, f->offset);
314 p += BIT64SZ;
315 PBIT32(p, f->count);
316 p += BIT32SZ;
317 break;
319 case Twrite:
320 PBIT32(p, f->fid);
321 p += BIT32SZ;
322 PBIT64(p, f->offset);
323 p += BIT64SZ;
324 PBIT32(p, f->count);
325 p += BIT32SZ;
326 memmove(p, f->data, f->count);
327 p += f->count;
328 break;
330 case Tclunk:
331 case Tremove:
332 PBIT32(p, f->fid);
333 p += BIT32SZ;
334 break;
336 case Tstat:
337 PBIT32(p, f->fid);
338 p += BIT32SZ;
339 break;
341 case Twstat:
342 PBIT32(p, f->fid);
343 p += BIT32SZ;
344 PBIT16(p, f->nstat);
345 p += BIT16SZ;
346 memmove(p, f->stat, f->nstat);
347 p += f->nstat;
348 break;
349 /*
350 */
352 case Rversion:
353 PBIT32(p, f->msize);
354 p += BIT32SZ;
355 p = pstring(p, f->version);
356 break;
358 case Rerror:
359 p = pstring(p, f->ename);
360 if(dotu){
361 PBIT32(p, f->errornum);
362 p += BIT32SZ;
364 break;
366 case Rflush:
367 break;
369 case Rauth:
370 p = pqid(p, &f->aqid);
371 break;
373 case Rattach:
374 p = pqid(p, &f->qid);
375 break;
377 case Rwalk:
378 PBIT16(p, f->nwqid);
379 p += BIT16SZ;
380 if(f->nwqid > MAXWELEM)
381 return 0;
382 for(i=0; i<f->nwqid; i++)
383 p = pqid(p, &f->wqid[i]);
384 break;
386 case Ropen:
387 case Rcreate:
388 case Ropenfd:
389 p = pqid(p, &f->qid);
390 PBIT32(p, f->iounit);
391 p += BIT32SZ;
392 if(f->type == Ropenfd){
393 PBIT32(p, f->unixfd);
394 p += BIT32SZ;
396 break;
398 case Rread:
399 PBIT32(p, f->count);
400 p += BIT32SZ;
401 memmove(p, f->data, f->count);
402 p += f->count;
403 break;
405 case Rwrite:
406 PBIT32(p, f->count);
407 p += BIT32SZ;
408 break;
410 case Rclunk:
411 break;
413 case Rremove:
414 break;
416 case Rstat:
417 PBIT16(p, f->nstat);
418 p += BIT16SZ;
419 memmove(p, f->stat, f->nstat);
420 p += f->nstat;
421 break;
423 case Rwstat:
424 break;
426 if(size != p-ap)
427 return 0;
428 return size;
431 uint
432 convS2M(Fcall *f, uchar *ap, uint nap)
434 return convS2Mu(f, ap, nap, 0);