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 <plan9.h>
2
#include <fcall.h>
3
#include <oldfcall.h>
4
 
5
/*
6
 * routines to package the old protocol in the new structures.
7
 */
8
 
9
#define	SHORT(x)	p[0]=f->x; p[1]=f->x>>8; p += 2
10
#define	LONG(x)		p[0]=f->x; p[1]=f->x>>8; p[2]=f->x>>16; p[3]=f->x>>24; p += 4
11
#define	VLONG(x)	p[0]=f->x;	p[1]=f->x>>8;\
12
			p[2]=f->x>>16;	p[3]=f->x>>24;\
13
			p[4]=f->x>>32;	p[5]=f->x>>40;\
14
			p[6]=f->x>>48;	p[7]=f->x>>56;\
15
			p += 8
16
#define	STRING(x,n)	strecpy((char*)p, (char*)p+n, f->x); p += n;
17
#define	FIXQID(q)		q.path ^= (q.path>>33); q.path &= 0x7FFFFFFF; q.path |= (q.type&0x80)<<24
18
 
19
uint
20
oldhdrsize(uchar type)
21
{
22
	switch(type){
23
	default:
24
		return 0;
25
	case oldTnop:
26
		return 3;
27
	case oldTflush:
28
		return 3+2;
29
	case oldTclone:
30
		return 3+2+2;
31
	case oldTwalk:
32
		return 3+2+28;
33
	case oldTopen:
34
		return 3+2+1;
35
	case oldTcreate:
36
		return 3+2+28+4+1;
37
	case oldTread:
38
		return 3+2+8+2;
39
	case oldTwrite:
40
		return 3+2+8+2+1;
41
	case oldTclunk:
42
		return 3+2;
43
	case oldTremove:
44
		return 3+2;
45
	case oldTstat:
46
		return 3+2;
47
	case oldTwstat:
48
		return 3+2+116;
49
	case oldTsession:
50
		return 3+8;
51
	case oldTattach:
52
		return 3+2+28+28+72+13;
53
	}
54
}
55
 
56
uint
57
iosize(uchar *p)
58
{
59
	if(p[0] != oldTwrite)
60
		return 0;
61
	return p[3+2+8] | (p[3+2+8+1]<<8);
62
}
63
 
64
uint
65
sizeS2M(Fcall *f)
66
{
67
	switch(f->type)
68
	{
69
	default:
70
		abort();
71
		return 0;
72
 
73
	/* no T messages */
74
 
75
/*
76
 */
77
	case Rversion:
78
		return 1+2;
79
 
80
/*
81
	case Rsession:
82
		return 1+2+8+28+48;
83
*/
84
 
85
	case Rattach:
86
		return 1+2+2+4+4+13;
87
 
88
	case Rerror:
89
		return 1+2+64;
90
 
91
	case Rflush:
92
		if(f->tag&0x8000)
93
			return 1+2+8+28+48;	/* session */
94
		return 1+2;
95
 
96
	/* assumes we don't ever see Tclwalk requests ... */
97
	case Rwalk:
98
		if(f->nwqid == 0)
99
			return 1+2+2;
100
		else
101
			return 1+2+2+4+4;
102
 
103
	case Ropen:
104
		return 1+2+2+4+4;
105
 
106
	case Rcreate:
107
		return 1+2+2+4+4;
108
 
109
	case Rread:
110
		return 1+2+2+2+1+f->count;
111
 
112
	case Rwrite:
113
		return 1+2+2+2;
114
 
115
	case Rclunk:
116
		return 1+2+2;
117
 
118
	case Rremove:
119
		return 1+2+2;
120
 
121
	case Rstat:
122
		return 1+2+2+116;
123
 
124
	case Rwstat:
125
		return 1+2+2;
126
	}
127
}
128
 
129
uint
130
convS2Mold(Fcall *f, uchar *ap, uint nap)
131
{
132
	uchar *p;
133
 
134
	if(nap < sizeS2M(f))
135
		return 0;
136
 
137
	p = ap;
138
	switch(f->type)
139
	{
140
	default:
141
		abort();
142
		return 0;
143
 
144
	/* no T messages */
145
 
146
/*
147
 */
148
	case Rversion:
149
		*p++ = oldRnop;
150
		SHORT(tag);
151
		break;
152
 
153
/*
154
	case Rsession:
155
		*p++ = oldRsession;
156
		SHORT(tag);
157
 
158
		if(f->nchal > 8)
159
			f->nchal = 8;
160
		memmove(p, f->chal, f->nchal);
161
		p += f->nchal;
162
		if(f->nchal < 8){
163
			memset(p, 0, 8 - f->nchal);
164
			p += 8 - f->nchal;
165
		}
166
 
167
		STRING(authid, 28);
168
		STRING(authdom, 48);
169
		break;
170
*/
171
 
172
	case Rattach:
173
		*p++ = oldRattach;
174
		SHORT(tag);
175
		SHORT(fid);
176
		FIXQID(f->qid);
177
		LONG(qid.path);
178
		LONG(qid.vers);
179
		memset(p, 0, 13);
180
		p += 13;
181
		break;
182
 
183
	case Rerror:
184
		*p++ = oldRerror;
185
		SHORT(tag);
186
		STRING(ename, 64);
187
		break;
188
 
189
	case Rflush:
190
		if(f->tag&0x8000){
191
			*p++ = oldRsession;
192
			f->tag &= ~0x8000;
193
			SHORT(tag);
194
			memset(p, 0, 8+28+48);
195
			p += 8+28+48;
196
		}else{
197
			*p++ = oldRflush;
198
			SHORT(tag);
199
		}
200
		break;
201
 
202
	/* assumes we don't ever see Tclwalk requests ... */
203
	case Rwalk:
204
		if(f->nwqid == 0){	/* successful clone */
205
			*p++ = oldRclone;
206
			SHORT(tag);
207
			SHORT(fid);
208
		}else{			/* successful 1-element walk */
209
			*p++ = oldRwalk;
210
			SHORT(tag);
211
			SHORT(fid);
212
			FIXQID(f->wqid[0]);
213
			LONG(wqid[0].path);
214
			LONG(wqid[0].vers);
215
		}
216
		break;
217
 
218
	case Ropen:
219
		*p++ = oldRopen;
220
		SHORT(tag);
221
		SHORT(fid);
222
		FIXQID(f->qid);
223
		LONG(qid.path);
224
		LONG(qid.vers);
225
		break;
226
 
227
	case Rcreate:
228
		*p++ = oldRcreate;
229
		SHORT(tag);
230
		SHORT(fid);
231
		FIXQID(f->qid);
232
		LONG(qid.path);
233
		LONG(qid.vers);
234
		break;
235
 
236
	case Rread:
237
		*p++ = oldRread;
238
		SHORT(tag);
239
		SHORT(fid);
240
		SHORT(count);
241
		p++;	/* pad(1) */
242
		memmove(p, f->data, f->count);
243
		p += f->count;
244
		break;
245
 
246
	case Rwrite:
247
		*p++ = oldRwrite;
248
		SHORT(tag);
249
		SHORT(fid);
250
		SHORT(count);
251
		break;
252
 
253
	case Rclunk:
254
		*p++ = oldRclunk;
255
		SHORT(tag);
256
		SHORT(fid);
257
		break;
258
 
259
	case Rremove:
260
		*p++ = oldRremove;
261
		SHORT(tag);
262
		SHORT(fid);
263
		break;
264
 
265
	case Rstat:
266
		*p++ = oldRstat;
267
		SHORT(tag);
268
		SHORT(fid);
269
		memmove(p, f->stat, 116);
270
		p += 116;
271
		break;
272
 
273
	case Rwstat:
274
		*p++ = oldRwstat;
275
		SHORT(tag);
276
		SHORT(fid);
277
		break;
278
	}
279
	return p - ap;
280
}
281
 
282
uint
283
sizeD2Mold(Dir *d)
284
{
285
	return 116;
286
}
287
 
288
uint
289
convD2Mold(Dir *f, uchar *ap, uint nap)
290
{
291
	uchar *p;
292
 
293
	if(nap < 116)
294
		return 0;
295
 
296
	p = ap;
297
	STRING(name, 28);
298
	STRING(uid, 28);
299
	STRING(gid, 28);
300
	FIXQID(f->qid);
301
	LONG(qid.path);
302
	LONG(qid.vers);
303
	LONG(mode);
304
	LONG(atime);
305
	LONG(mtime);
306
	VLONG(length);
307
	SHORT(type);
308
	SHORT(dev);
309
 
310
	return p - ap;
311
}
312
 
313
#undef SHORT
314
#undef LONG
315
#undef VLONG
316
#undef STRING
317
#define	CHAR(x)	f->x = *p++
318
#define	SHORT(x)	f->x = (p[0] | (p[1]<<8)); p += 2
319
#define	LONG(x)		f->x = (p[0] | (p[1]<<8) |\
320
				(p[2]<<16) | (p[3]<<24)); p += 4
321
#define	VLONG(x)	f->x = (ulong)(p[0] | (p[1]<<8) |\
322
					(p[2]<<16) | (p[3]<<24)) |\
323
				((vlong)(p[4] | (p[5]<<8) |\
324
					(p[6]<<16) | (p[7]<<24)) << 32); p += 8
325
#define	STRING(x,n)	f->x = (char*)p; p += n
326
 
327
uint
328
convM2Sold(uchar *ap, uint nap, Fcall *f)
329
{
330
	uchar *p, *q, *ep;
331
 
332
	p = ap;
333
	ep = p + nap;
334
 
335
	if(p+3 > ep)
336
		return 0;
337
 
338
	switch(*p++){
339
	case oldTnop:
340
		f->type = Tversion;
341
		SHORT(tag);
342
		f->msize = 0;
343
		f->version = "9P1";
344
		break;
345
 
346
	case oldTflush:
347
		f->type = Tflush;
348
		SHORT(tag);
349
		if(p+2 > ep)
350
			return 0;
351
		SHORT(oldtag);
352
		break;
353
 
354
	case oldTclone:
355
		f->type = Twalk;
356
		SHORT(tag);
357
		if(p+2+2 > ep)
358
			return 0;
359
		SHORT(fid);
360
		SHORT(newfid);
361
		f->nwname = 0;
362
		break;
363
 
364
	case oldTwalk:
365
		f->type = Twalk;
366
		SHORT(tag);
367
		if(p+2+28 > ep)
368
			return 0;
369
		SHORT(fid);
370
		f->newfid = f->fid;
371
		f->nwname = 1;
372
		f->wname[0] = (char*)p;
373
		p += 28;
374
		break;
375
 
376
	case oldTopen:
377
		f->type = Topen;
378
		SHORT(tag);
379
		if(p+2+1 > ep)
380
			return 0;
381
		SHORT(fid);
382
		CHAR(mode);
383
		break;
384
 
385
	case oldTcreate:
386
		f->type = Tcreate;
387
		SHORT(tag);
388
		if(p+2+28+4+1 > ep)
389
			return 0;
390
		SHORT(fid);
391
		f->name = (char*)p;
392
		p += 28;
393
		LONG(perm);
394
		CHAR(mode);
395
		break;
396
 
397
	case oldTread:
398
		f->type = Tread;
399
		SHORT(tag);
400
		if(p+2+8+2 > ep)
401
			return 0;
402
		SHORT(fid);
403
		VLONG(offset);
404
		SHORT(count);
405
		break;
406
 
407
	case oldTwrite:
408
		f->type = Twrite;
409
		SHORT(tag);
410
		if(p+2+8+2+1 > ep)
411
			return 0;
412
		SHORT(fid);
413
		VLONG(offset);
414
		SHORT(count);
415
		p++;	/* pad(1) */
416
		if(p+f->count > ep)
417
			return 0;
418
		f->data = (char*)p;
419
		p += f->count;
420
		break;
421
 
422
	case oldTclunk:
423
		f->type = Tclunk;
424
		SHORT(tag);
425
		if(p+2 > ep)
426
			return 0;
427
		SHORT(fid);
428
		break;
429
 
430
	case oldTremove:
431
		f->type = Tremove;
432
		SHORT(tag);
433
		if(p+2 > ep)
434
			return 0;
435
		SHORT(fid);
436
		break;
437
 
438
	case oldTstat:
439
		f->type = Tstat;
440
		f->nstat = 116;
441
		SHORT(tag);
442
		if(p+2 > ep)
443
			return 0;
444
		SHORT(fid);
445
		break;
446
 
447
	case oldTwstat:
448
		f->type = Twstat;
449
		SHORT(tag);
450
		if(p+2+116 > ep)
451
			return 0;
452
		SHORT(fid);
453
		f->stat = p;
454
		q = p+28*3+5*4;
455
		memset(q, 0xFF, 8);	/* clear length to ``don't care'' */
456
		p += 116;
457
		break;
458
 
459
/*
460
	case oldTsession:
461
		f->type = Tsession;
462
		SHORT(tag);
463
		if(p+8 > ep)
464
			return 0;
465
		f->chal = p;
466
		p += 8;
467
		f->nchal = 8;
468
		break;
469
*/
470
	case oldTsession:
471
		f->type = Tflush;
472
		SHORT(tag);
473
		f->tag |= 0x8000;
474
		f->oldtag = f->tag;
475
		p += 8;
476
		break;
477
 
478
	case oldTattach:
479
		f->type = Tattach;
480
		SHORT(tag);
481
		if(p+2+28+28+72+13 > ep)
482
			return 0;
483
		SHORT(fid);
484
		STRING(uname, 28);
485
		STRING(aname, 28);
486
		p += 72+13;
487
		f->afid = NOFID;
488
		break;
489
 
490
	default:
491
		return 0;
492
	}
493
 
494
	return p-ap;
495
}
496
 
497
uint
498
convM2Dold(uchar *ap, uint nap, Dir *f, char *strs)
499
{
500
	uchar *p;
501
 
502
	USED(strs);
503
 
504
	if(nap < 116)
505
		return 0;
506
 
507
	p = (uchar*)ap;
508
	STRING(name, 28);
509
	STRING(uid, 28);
510
	STRING(gid, 28);
511
	LONG(qid.path);
512
	LONG(qid.vers);
513
	LONG(mode);
514
	LONG(atime);
515
	LONG(mtime);
516
	VLONG(length);
517
	SHORT(type);
518
	SHORT(dev);
519
	f->qid.type = (f->mode>>24)&0xF0;
520
	return p - (uchar*)ap;
521
}