xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/_fcall.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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