Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
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
}