1 #include <string.h>
2 #include "sys9.h"
3 #include "lib.h"
4 #include "dir.h"
5 #include "fcall.h"
6
7 typedef unsigned char uchar;
8
9 #define CHAR(x) *p++ = f->x
10 #define SHORT(x) p[0] = f->x; p[1] = f->x>>8; p += 2
11 #define LONG(x) p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24; p += 4
12 #define VLONG(x) p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24;\
13 p[4] = 0; p[5] = 0; p[6] = 0; p[7] = 0; p += 8
14 #define STRING(x,n) memcpy(p, f->x, n); p += n
15
16 int
convS2M(Fcall * f,char * ap)17 convS2M(Fcall *f, char *ap)
18 {
19 uchar *p;
20
21 p = (uchar*)ap;
22 CHAR(type);
23 SHORT(tag);
24 switch(f->type)
25 {
26 default:
27 return 0;
28
29 case Tosession:
30 case Tnop:
31 break;
32
33 case Tsession:
34 STRING(chal, sizeof(f->chal));
35 break;
36
37 case Tflush:
38 SHORT(oldtag);
39 break;
40
41 case Tattach:
42 SHORT(fid);
43 STRING(uname, sizeof(f->uname));
44 STRING(aname, sizeof(f->aname));
45 STRING(ticket, sizeof(f->ticket));
46 STRING(auth, sizeof(f->auth));
47 break;
48
49 case Toattach:
50 SHORT(fid);
51 STRING(uname, sizeof(f->uname));
52 STRING(aname, sizeof(f->aname));
53 STRING(ticket, NAMELEN);
54 break;
55
56 case Tauth:
57 SHORT(fid);
58 STRING(uname, sizeof(f->uname));
59 STRING(ticket, 8+NAMELEN);
60 break;
61
62 case Tclone:
63 SHORT(fid);
64 SHORT(newfid);
65 break;
66
67 case Twalk:
68 SHORT(fid);
69 STRING(name, sizeof(f->name));
70 break;
71
72 case Topen:
73 SHORT(fid);
74 CHAR(mode);
75 break;
76
77 case Tcreate:
78 SHORT(fid);
79 STRING(name, sizeof(f->name));
80 LONG(perm);
81 CHAR(mode);
82 break;
83
84 case Tread:
85 SHORT(fid);
86 VLONG(offset);
87 SHORT(count);
88 break;
89
90 case Twrite:
91 SHORT(fid);
92 VLONG(offset);
93 SHORT(count);
94 p++; /* pad(1) */
95 STRING(data, f->count);
96 break;
97
98 case Tclunk:
99 SHORT(fid);
100 break;
101
102 case Tremove:
103 SHORT(fid);
104 break;
105
106 case Tstat:
107 SHORT(fid);
108 break;
109
110 case Twstat:
111 SHORT(fid);
112 STRING(stat, sizeof(f->stat));
113 break;
114
115 case Tclwalk:
116 SHORT(fid);
117 SHORT(newfid);
118 STRING(name, sizeof(f->name));
119 break;
120 /*
121 */
122 case Rosession:
123 case Rnop:
124 break;
125
126 case Rsession:
127 STRING(chal, sizeof(f->chal));
128 STRING(authid, sizeof(f->authid));
129 STRING(authdom, sizeof(f->authdom));
130 break;
131
132 case Rerror:
133 STRING(ename, sizeof(f->ename));
134 break;
135
136 case Rflush:
137 break;
138
139 case Rattach:
140 SHORT(fid);
141 LONG(qid.path);
142 LONG(qid.vers);
143 STRING(rauth, sizeof(f->rauth));
144 break;
145
146 case Roattach:
147 SHORT(fid);
148 LONG(qid.path);
149 LONG(qid.vers);
150 break;
151
152 case Rauth:
153 SHORT(fid);
154 STRING(ticket, 8+8+7+7);
155 break;
156
157 case Rclone:
158 SHORT(fid);
159 break;
160
161 case Rwalk:
162 case Rclwalk:
163 SHORT(fid);
164 LONG(qid.path);
165 LONG(qid.vers);
166 break;
167
168 case Ropen:
169 SHORT(fid);
170 LONG(qid.path);
171 LONG(qid.vers);
172 break;
173
174 case Rcreate:
175 SHORT(fid);
176 LONG(qid.path);
177 LONG(qid.vers);
178 break;
179
180 case Rread:
181 SHORT(fid);
182 SHORT(count);
183 p++; /* pad(1) */
184 STRING(data, f->count);
185 break;
186
187 case Rwrite:
188 SHORT(fid);
189 SHORT(count);
190 break;
191
192 case Rclunk:
193 SHORT(fid);
194 break;
195
196 case Rremove:
197 SHORT(fid);
198 break;
199
200 case Rstat:
201 SHORT(fid);
202 STRING(stat, sizeof(f->stat));
203 break;
204
205 case Rwstat:
206 SHORT(fid);
207 break;
208 }
209 return p - (uchar*)ap;
210 }
211
212 #undef CHAR
213 #undef SHORT
214 #undef LONG
215 #undef VLONG
216 #undef STRING
217
218 #define CHAR(x) f->x = *p++
219 #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
220 #define LONG(x) f->x = (p[0] | (p[1]<<8) |\
221 (p[2]<<16) | (p[3]<<24)); p += 4
222 #define VLONG(x) f->x = (p[0] | (p[1]<<8) |\
223 (p[2]<<16) | (p[3]<<24)); p += 8
224 #define STRING(x,n) memcpy(f->x, p, n); p += n
225
226 int
convM2S(char * ap,Fcall * f,int n)227 convM2S(char *ap, Fcall *f, int n)
228 {
229 uchar *p;
230
231 p = (uchar*)ap;
232 CHAR(type);
233 SHORT(tag);
234 switch(f->type)
235 {
236 default:
237 return 0;
238
239 case Tnop:
240 case Tosession:
241 break;
242
243 case Tsession:
244 STRING(chal, sizeof(f->chal));
245 break;
246
247 case Tflush:
248 SHORT(oldtag);
249 break;
250
251 case Tattach:
252 SHORT(fid);
253 STRING(uname, sizeof(f->uname));
254 STRING(aname, sizeof(f->aname));
255 STRING(ticket, sizeof(f->ticket));
256 STRING(auth, sizeof(f->auth));
257 break;
258
259 case Toattach:
260 SHORT(fid);
261 STRING(uname, sizeof(f->uname));
262 STRING(aname, sizeof(f->aname));
263 STRING(ticket, NAMELEN);
264 break;
265
266 case Tauth:
267 SHORT(fid);
268 STRING(uname, sizeof(f->uname));
269 STRING(ticket, 8+NAMELEN);
270 break;
271
272 case Tclone:
273 SHORT(fid);
274 SHORT(newfid);
275 break;
276
277 case Twalk:
278 SHORT(fid);
279 STRING(name, sizeof(f->name));
280 break;
281
282 case Topen:
283 SHORT(fid);
284 CHAR(mode);
285 break;
286
287 case Tcreate:
288 SHORT(fid);
289 STRING(name, sizeof(f->name));
290 LONG(perm);
291 CHAR(mode);
292 break;
293
294 case Tread:
295 SHORT(fid);
296 VLONG(offset);
297 SHORT(count);
298 break;
299
300 case Twrite:
301 SHORT(fid);
302 VLONG(offset);
303 SHORT(count);
304 p++; /* pad(1) */
305 f->data = (char*)p; p += f->count;
306 break;
307
308 case Tclunk:
309 SHORT(fid);
310 break;
311
312 case Tremove:
313 SHORT(fid);
314 break;
315
316 case Tstat:
317 SHORT(fid);
318 break;
319
320 case Twstat:
321 SHORT(fid);
322 STRING(stat, sizeof(f->stat));
323 break;
324
325 case Tclwalk:
326 SHORT(fid);
327 SHORT(newfid);
328 STRING(name, sizeof(f->name));
329 break;
330 /*
331 */
332 case Rnop:
333 case Rosession:
334 break;
335
336 case Rsession:
337 STRING(chal, sizeof(f->chal));
338 STRING(authid, sizeof(f->authid));
339 STRING(authdom, sizeof(f->authdom));
340 break;
341
342 case Rerror:
343 STRING(ename, sizeof(f->ename));
344 break;
345
346 case Rflush:
347 break;
348
349 case Rattach:
350 SHORT(fid);
351 LONG(qid.path);
352 LONG(qid.vers);
353 STRING(rauth, sizeof(f->rauth));
354 break;
355
356 case Roattach:
357 SHORT(fid);
358 LONG(qid.path);
359 LONG(qid.vers);
360 break;
361
362 case Rauth:
363 SHORT(fid);
364 STRING(ticket, 8+8+7+7);
365 break;
366
367 case Rclone:
368 SHORT(fid);
369 break;
370
371 case Rwalk:
372 case Rclwalk:
373 SHORT(fid);
374 LONG(qid.path);
375 LONG(qid.vers);
376 break;
377
378 case Ropen:
379 SHORT(fid);
380 LONG(qid.path);
381 LONG(qid.vers);
382 break;
383
384 case Rcreate:
385 SHORT(fid);
386 LONG(qid.path);
387 LONG(qid.vers);
388 break;
389
390 case Rread:
391 SHORT(fid);
392 SHORT(count);
393 p++; /* pad(1) */
394 f->data = (char*)p; p += f->count;
395 break;
396
397 case Rwrite:
398 SHORT(fid);
399 SHORT(count);
400 break;
401
402 case Rclunk:
403 SHORT(fid);
404 break;
405
406 case Rremove:
407 SHORT(fid);
408 break;
409
410 case Rstat:
411 SHORT(fid);
412 STRING(stat, sizeof(f->stat));
413 break;
414
415 case Rwstat:
416 SHORT(fid);
417 break;
418 }
419 if((uchar*)ap+n == p)
420 return n;
421 return 0;
422 }
423