xref: /plan9/sys/src/cmd/srvold9p/9p1lib.c (revision 22a127bbfe4dd304949cc596400de973c0138e31)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <auth.h>
49a747e4fSDavid du Colombier #include	"9p1.h"
59a747e4fSDavid du Colombier #pragma	varargck	type	"D"	Dir*	/* from fcall.h */
69a747e4fSDavid du Colombier 
79a747e4fSDavid du Colombier static void dumpsome(char*, char*, long);
89a747e4fSDavid du Colombier 
99a747e4fSDavid du Colombier int
fcallfmt9p1(Fmt * f1)109a747e4fSDavid du Colombier fcallfmt9p1(Fmt *f1)
119a747e4fSDavid du Colombier {
129a747e4fSDavid du Colombier 	Fcall9p1 *f;
139a747e4fSDavid du Colombier 	int fid, type, tag, n;
149a747e4fSDavid du Colombier 	char buf[512];
159a747e4fSDavid du Colombier 	Dir d;
169a747e4fSDavid du Colombier 
179a747e4fSDavid du Colombier 	f = va_arg(f1->args, Fcall9p1*);
189a747e4fSDavid du Colombier 	type = f->type;
199a747e4fSDavid du Colombier 	fid = f->fid;
209a747e4fSDavid du Colombier 	tag = f->tag;
219a747e4fSDavid du Colombier 	switch(type){
229a747e4fSDavid du Colombier 	case Tnop9p1:	/* 50 */
239a747e4fSDavid du Colombier 		sprint(buf, "old Tnop tag %ud", tag);
249a747e4fSDavid du Colombier 		break;
259a747e4fSDavid du Colombier 	case Rnop9p1:
269a747e4fSDavid du Colombier 		sprint(buf, "old Rnop tag %ud", tag);
279a747e4fSDavid du Colombier 		break;
289a747e4fSDavid du Colombier 	case Tsession9p1:	/* 52 */
299a747e4fSDavid du Colombier 		sprint(buf, "old Tsession tag %ud", tag);
309a747e4fSDavid du Colombier 		break;
319a747e4fSDavid du Colombier 	case Rsession9p1:
329a747e4fSDavid du Colombier 		sprint(buf, "old Rsession tag %ud", tag);
339a747e4fSDavid du Colombier 		break;
349a747e4fSDavid du Colombier 	case Rerror9p1:	/* 55 */
359a747e4fSDavid du Colombier 		sprint(buf, "old Rerror tag %ud error %.64s", tag, f->ename);
369a747e4fSDavid du Colombier 		break;
379a747e4fSDavid du Colombier 	case Tflush9p1:	/* 56 */
389a747e4fSDavid du Colombier 		sprint(buf, "old Tflush tag %ud oldtag %d", tag, f->oldtag);
399a747e4fSDavid du Colombier 		break;
409a747e4fSDavid du Colombier 	case Rflush9p1:
419a747e4fSDavid du Colombier 		sprint(buf, "old Rflush tag %ud", tag);
429a747e4fSDavid du Colombier 		break;
439a747e4fSDavid du Colombier 	case Tattach9p1:	/* 58 */
449a747e4fSDavid du Colombier 		sprint(buf, "old Tattach tag %ud fid %d uname %.28s aname %.28s auth %.28s",
459a747e4fSDavid du Colombier 			tag, f->fid, f->uname, f->aname, f->auth);
469a747e4fSDavid du Colombier 		break;
479a747e4fSDavid du Colombier 	case Rattach9p1:
489a747e4fSDavid du Colombier 		sprint(buf, "old Rattach tag %ud fid %d qid 0x%lux|0x%lux",
499a747e4fSDavid du Colombier 			tag, fid, f->qid.path, f->qid.version);
509a747e4fSDavid du Colombier 		break;
519a747e4fSDavid du Colombier 	case Tclone9p1:	/* 60 */
529a747e4fSDavid du Colombier 		sprint(buf, "old Tclone tag %ud fid %d newfid %d", tag, fid, f->newfid);
539a747e4fSDavid du Colombier 		break;
549a747e4fSDavid du Colombier 	case Rclone9p1:
559a747e4fSDavid du Colombier 		sprint(buf, "old Rclone tag %ud fid %d", tag, fid);
569a747e4fSDavid du Colombier 		break;
579a747e4fSDavid du Colombier 	case Twalk9p1:	/* 62 */
589a747e4fSDavid du Colombier 		sprint(buf, "old Twalk tag %ud fid %d name %.28s", tag, fid, f->name);
599a747e4fSDavid du Colombier 		break;
609a747e4fSDavid du Colombier 	case Rwalk9p1:
619a747e4fSDavid du Colombier 		sprint(buf, "old Rwalk tag %ud fid %d qid 0x%lux|0x%lux",
629a747e4fSDavid du Colombier 			tag, fid, f->qid.path, f->qid.version);
639a747e4fSDavid du Colombier 		break;
649a747e4fSDavid du Colombier 	case Topen9p1:	/* 64 */
659a747e4fSDavid du Colombier 		sprint(buf, "old Topen tag %ud fid %d mode %d", tag, fid, f->mode);
669a747e4fSDavid du Colombier 		break;
679a747e4fSDavid du Colombier 	case Ropen9p1:
689a747e4fSDavid du Colombier 		sprint(buf, "old Ropen tag %ud fid %d qid 0x%lux|0x%lux",
699a747e4fSDavid du Colombier 			tag, fid, f->qid.path, f->qid.version);
709a747e4fSDavid du Colombier 		break;
719a747e4fSDavid du Colombier 	case Tcreate9p1:	/* 66 */
729a747e4fSDavid du Colombier 		sprint(buf, "old Tcreate tag %ud fid %d name %.28s perm 0x%lux mode %d",
739a747e4fSDavid du Colombier 			tag, fid, f->name, f->perm, f->mode);
749a747e4fSDavid du Colombier 		break;
759a747e4fSDavid du Colombier 	case Rcreate9p1:
769a747e4fSDavid du Colombier 		sprint(buf, "old Rcreate tag %ud fid %d qid 0x%lux|0x%lux",
779a747e4fSDavid du Colombier 			tag, fid, f->qid.path, f->qid.version);
789a747e4fSDavid du Colombier 		break;
799a747e4fSDavid du Colombier 	case Tread9p1:	/* 68 */
809a747e4fSDavid du Colombier 		sprint(buf, "old Tread tag %ud fid %d offset %ld count %ld",
819a747e4fSDavid du Colombier 			tag, fid, f->offset, f->count);
829a747e4fSDavid du Colombier 		break;
839a747e4fSDavid du Colombier 	case Rread9p1:
849a747e4fSDavid du Colombier 		n = sprint(buf, "old Rread tag %ud fid %d count %ld ", tag, fid, f->count);
859a747e4fSDavid du Colombier 			dumpsome(buf+n, f->data, f->count);
869a747e4fSDavid du Colombier 		break;
879a747e4fSDavid du Colombier 	case Twrite9p1:	/* 70 */
889a747e4fSDavid du Colombier 		n = sprint(buf, "old Twrite tag %ud fid %d offset %ld count %ld ",
899a747e4fSDavid du Colombier 			tag, fid, f->offset, f->count);
909a747e4fSDavid du Colombier 		dumpsome(buf+n, f->data, f->count);
919a747e4fSDavid du Colombier 		break;
929a747e4fSDavid du Colombier 	case Rwrite9p1:
939a747e4fSDavid du Colombier 		sprint(buf, "old Rwrite tag %ud fid %d count %ld", tag, fid, f->count);
949a747e4fSDavid du Colombier 		break;
959a747e4fSDavid du Colombier 	case Tclunk9p1:	/* 72 */
969a747e4fSDavid du Colombier 		sprint(buf, "old Tclunk tag %ud fid %d", tag, fid);
979a747e4fSDavid du Colombier 		break;
989a747e4fSDavid du Colombier 	case Rclunk9p1:
999a747e4fSDavid du Colombier 		sprint(buf, "old Rclunk tag %ud fid %d", tag, fid);
1009a747e4fSDavid du Colombier 		break;
1019a747e4fSDavid du Colombier 	case Tremove9p1:	/* 74 */
1029a747e4fSDavid du Colombier 		sprint(buf, "old Tremove tag %ud fid %d", tag, fid);
1039a747e4fSDavid du Colombier 		break;
1049a747e4fSDavid du Colombier 	case Rremove9p1:
1059a747e4fSDavid du Colombier 		sprint(buf, "old Rremove tag %ud fid %d", tag, fid);
1069a747e4fSDavid du Colombier 		break;
1079a747e4fSDavid du Colombier 	case Tstat9p1:	/* 76 */
1089a747e4fSDavid du Colombier 		sprint(buf, "old Tstat tag %ud fid %d", tag, fid);
1099a747e4fSDavid du Colombier 		break;
1109a747e4fSDavid du Colombier 	case Rstat9p1:
1119a747e4fSDavid du Colombier 		convM2D9p1(f->stat, &d);
1129a747e4fSDavid du Colombier 		sprint(buf, "old Rstat tag %ud fid %d stat %D", tag, fid, &d);
1139a747e4fSDavid du Colombier 		break;
1149a747e4fSDavid du Colombier 	case Twstat9p1:	/* 78 */
1159a747e4fSDavid du Colombier 		convM2D9p1(f->stat, &d);
1169a747e4fSDavid du Colombier 		sprint(buf, "old Twstat tag %ud fid %d stat %D", tag, fid, &d);
1179a747e4fSDavid du Colombier 		break;
1189a747e4fSDavid du Colombier 	case Rwstat9p1:
1199a747e4fSDavid du Colombier 		sprint(buf, "old Rwstat tag %ud fid %d", tag, fid);
1209a747e4fSDavid du Colombier 		break;
1219a747e4fSDavid du Colombier 	case Tclwalk9p1:	/* 81 */
1229a747e4fSDavid du Colombier 		sprint(buf, "old Tclwalk tag %ud fid %d newfid %d name %.28s",
1239a747e4fSDavid du Colombier 			tag, fid, f->newfid, f->name);
1249a747e4fSDavid du Colombier 		break;
1259a747e4fSDavid du Colombier 	case Rclwalk9p1:
1269a747e4fSDavid du Colombier 		sprint(buf, "old Rclwalk tag %ud fid %d qid 0x%lux|0x%lux",
1279a747e4fSDavid du Colombier 			tag, fid, f->qid.path, f->qid.version);
1289a747e4fSDavid du Colombier 		break;
1299a747e4fSDavid du Colombier 	default:
1309a747e4fSDavid du Colombier 		sprint(buf,  "unknown type %d", type);
1319a747e4fSDavid du Colombier 	}
1329a747e4fSDavid du Colombier 	return fmtstrcpy(f1, buf);
1339a747e4fSDavid du Colombier }
1349a747e4fSDavid du Colombier 
1359a747e4fSDavid du Colombier /*
1369a747e4fSDavid du Colombier  * dump out count (or DUMPL, if count is bigger) bytes from
1379a747e4fSDavid du Colombier  * buf to ans, as a string if they are all printable,
1389a747e4fSDavid du Colombier  * else as a series of hex bytes
1399a747e4fSDavid du Colombier  */
1409a747e4fSDavid du Colombier #define DUMPL 64
1419a747e4fSDavid du Colombier 
1429a747e4fSDavid du Colombier static void
dumpsome(char * ans,char * buf,long count)1439a747e4fSDavid du Colombier dumpsome(char *ans, char *buf, long count)
1449a747e4fSDavid du Colombier {
1459a747e4fSDavid du Colombier 	int i, printable;
1469a747e4fSDavid du Colombier 	char *p;
1479a747e4fSDavid du Colombier 
1489a747e4fSDavid du Colombier 	printable = 1;
1499a747e4fSDavid du Colombier 	if(count > DUMPL)
1509a747e4fSDavid du Colombier 		count = DUMPL;
1519a747e4fSDavid du Colombier 	for(i=0; i<count && printable; i++)
152*22a127bbSDavid du Colombier 		if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127)
1539a747e4fSDavid du Colombier 			printable = 0;
1549a747e4fSDavid du Colombier 	p = ans;
1559a747e4fSDavid du Colombier 	*p++ = '\'';
1569a747e4fSDavid du Colombier 	if(printable){
1579a747e4fSDavid du Colombier 		memmove(p, buf, count);
1589a747e4fSDavid du Colombier 		p += count;
1599a747e4fSDavid du Colombier 	}else{
1609a747e4fSDavid du Colombier 		for(i=0; i<count; i++){
1619a747e4fSDavid du Colombier 			if(i>0 && i%4==0)
1629a747e4fSDavid du Colombier 				*p++ = ' ';
1639a747e4fSDavid du Colombier 			sprint(p, "%2.2ux", buf[i]);
1649a747e4fSDavid du Colombier 			p += 2;
1659a747e4fSDavid du Colombier 		}
1669a747e4fSDavid du Colombier 	}
1679a747e4fSDavid du Colombier 	*p++ = '\'';
1689a747e4fSDavid du Colombier 	*p = 0;
1699a747e4fSDavid du Colombier }
1709a747e4fSDavid du Colombier 
1719a747e4fSDavid du Colombier #define	CHAR(x)		*p++ = f->x
1729a747e4fSDavid du Colombier #define	SHORT(x)	{ ulong vvv = f->x; p[0] = vvv; p[1] = vvv>>8; p += 2; }
1739a747e4fSDavid du Colombier #define	VLONG(q)	p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4
1749a747e4fSDavid du Colombier #define	LONG(x)		{ ulong vvv = f->x; VLONG(vvv); }
1759a747e4fSDavid du Colombier #define	BYTES(x,n)	memmove(p, f->x, n); p += n
1769a747e4fSDavid du Colombier #define	STRING(x,n)	strncpy((char*)p, f->x, n); p += n
1779a747e4fSDavid du Colombier 
1789a747e4fSDavid du Colombier int
convS2M9p1(Fcall9p1 * f,char * ap)1799a747e4fSDavid du Colombier convS2M9p1(Fcall9p1 *f, char *ap)
1809a747e4fSDavid du Colombier {
1819a747e4fSDavid du Colombier 	uchar *p;
1829a747e4fSDavid du Colombier 	int t;
1839a747e4fSDavid du Colombier 
1849a747e4fSDavid du Colombier 	p = (uchar*)ap;
1859a747e4fSDavid du Colombier 	CHAR(type);
1869a747e4fSDavid du Colombier 	t = f->type;
1879a747e4fSDavid du Colombier 	SHORT(tag);
1889a747e4fSDavid du Colombier 	switch(t)
1899a747e4fSDavid du Colombier 	{
1909a747e4fSDavid du Colombier 	default:
1919a747e4fSDavid du Colombier 		fprint(2, "convS2M9p1: bad type: %d\n", t);
1929a747e4fSDavid du Colombier 		return 0;
1939a747e4fSDavid du Colombier 
1949a747e4fSDavid du Colombier 	case Tnop9p1:
1959a747e4fSDavid du Colombier 	case Tosession9p1:
1969a747e4fSDavid du Colombier 		break;
1979a747e4fSDavid du Colombier 
1989a747e4fSDavid du Colombier 	case Tsession9p1:
1999a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
2009a747e4fSDavid du Colombier 		break;
2019a747e4fSDavid du Colombier 
2029a747e4fSDavid du Colombier 	case Tflush9p1:
2039a747e4fSDavid du Colombier 		SHORT(oldtag);
2049a747e4fSDavid du Colombier 		break;
2059a747e4fSDavid du Colombier 
2069a747e4fSDavid du Colombier 	case Tattach9p1:
2079a747e4fSDavid du Colombier 		SHORT(fid);
2089a747e4fSDavid du Colombier 		STRING(uname, sizeof(f->uname));
2099a747e4fSDavid du Colombier 		STRING(aname, sizeof(f->aname));
2109a747e4fSDavid du Colombier 		BYTES(ticket, sizeof(f->ticket));
2119a747e4fSDavid du Colombier 		BYTES(auth, sizeof(f->auth));
2129a747e4fSDavid du Colombier 		break;
2139a747e4fSDavid du Colombier 
2149a747e4fSDavid du Colombier 	case Toattach9p1:
2159a747e4fSDavid du Colombier 		SHORT(fid);
2169a747e4fSDavid du Colombier 		STRING(uname, sizeof(f->uname));
2179a747e4fSDavid du Colombier 		STRING(aname, sizeof(f->aname));
2189a747e4fSDavid du Colombier 		BYTES(ticket, NAMEREC);
2199a747e4fSDavid du Colombier 		break;
2209a747e4fSDavid du Colombier 
2219a747e4fSDavid du Colombier 	case Tclone9p1:
2229a747e4fSDavid du Colombier 		SHORT(fid);
2239a747e4fSDavid du Colombier 		SHORT(newfid);
2249a747e4fSDavid du Colombier 		break;
2259a747e4fSDavid du Colombier 
2269a747e4fSDavid du Colombier 	case Twalk9p1:
2279a747e4fSDavid du Colombier 		SHORT(fid);
2289a747e4fSDavid du Colombier 		STRING(name, sizeof(f->name));
2299a747e4fSDavid du Colombier 		break;
2309a747e4fSDavid du Colombier 
2319a747e4fSDavid du Colombier 	case Tclwalk9p1:
2329a747e4fSDavid du Colombier 		SHORT(fid);
2339a747e4fSDavid du Colombier 		SHORT(newfid);
2349a747e4fSDavid du Colombier 		STRING(name, sizeof(f->name));
2359a747e4fSDavid du Colombier 		break;
2369a747e4fSDavid du Colombier 
2379a747e4fSDavid du Colombier 	case Topen9p1:
2389a747e4fSDavid du Colombier 		SHORT(fid);
2399a747e4fSDavid du Colombier 		CHAR(mode);
2409a747e4fSDavid du Colombier 		break;
2419a747e4fSDavid du Colombier 
2429a747e4fSDavid du Colombier 	case Tcreate9p1:
2439a747e4fSDavid du Colombier 		SHORT(fid);
2449a747e4fSDavid du Colombier 		STRING(name, sizeof(f->name));
2459a747e4fSDavid du Colombier 		LONG(perm);
2469a747e4fSDavid du Colombier 		CHAR(mode);
2479a747e4fSDavid du Colombier 		break;
2489a747e4fSDavid du Colombier 
2499a747e4fSDavid du Colombier 	case Tread9p1:
2509a747e4fSDavid du Colombier 		SHORT(fid);
2519a747e4fSDavid du Colombier 		LONG(offset); VLONG(0);
2529a747e4fSDavid du Colombier 		SHORT(count);
2539a747e4fSDavid du Colombier 		break;
2549a747e4fSDavid du Colombier 
2559a747e4fSDavid du Colombier 	case Twrite9p1:
2569a747e4fSDavid du Colombier 		SHORT(fid);
2579a747e4fSDavid du Colombier 		LONG(offset); VLONG(0);
2589a747e4fSDavid du Colombier 		SHORT(count);
2599a747e4fSDavid du Colombier 		p++;
2609a747e4fSDavid du Colombier 		if((uchar*)p == (uchar*)f->data) {
2619a747e4fSDavid du Colombier 			p += f->count;
2629a747e4fSDavid du Colombier 			break;
2639a747e4fSDavid du Colombier 		}
2649a747e4fSDavid du Colombier 		BYTES(data, f->count);
2659a747e4fSDavid du Colombier 		break;
2669a747e4fSDavid du Colombier 
2679a747e4fSDavid du Colombier 	case Tclunk9p1:
2689a747e4fSDavid du Colombier 	case Tremove9p1:
2699a747e4fSDavid du Colombier 	case Tstat9p1:
2709a747e4fSDavid du Colombier 		SHORT(fid);
2719a747e4fSDavid du Colombier 		break;
2729a747e4fSDavid du Colombier 
2739a747e4fSDavid du Colombier 	case Twstat9p1:
2749a747e4fSDavid du Colombier 		SHORT(fid);
2759a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
2769a747e4fSDavid du Colombier 		break;
2779a747e4fSDavid du Colombier /*
2789a747e4fSDavid du Colombier  */
2799a747e4fSDavid du Colombier 	case Rnop9p1:
2809a747e4fSDavid du Colombier 	case Rosession9p1:
2819a747e4fSDavid du Colombier 	case Rflush9p1:
2829a747e4fSDavid du Colombier 		break;
2839a747e4fSDavid du Colombier 
2849a747e4fSDavid du Colombier 	case Rsession9p1:
2859a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
2869a747e4fSDavid du Colombier 		BYTES(authid, sizeof(f->authid));
2879a747e4fSDavid du Colombier 		BYTES(authdom, sizeof(f->authdom));
2889a747e4fSDavid du Colombier 		break;
2899a747e4fSDavid du Colombier 
2909a747e4fSDavid du Colombier 	case Rerror9p1:
2919a747e4fSDavid du Colombier 		STRING(ename, sizeof(f->ename));
2929a747e4fSDavid du Colombier 		break;
2939a747e4fSDavid du Colombier 
2949a747e4fSDavid du Colombier 	case Rclone9p1:
2959a747e4fSDavid du Colombier 	case Rclunk9p1:
2969a747e4fSDavid du Colombier 	case Rremove9p1:
2979a747e4fSDavid du Colombier 	case Rwstat9p1:
2989a747e4fSDavid du Colombier 		SHORT(fid);
2999a747e4fSDavid du Colombier 		break;
3009a747e4fSDavid du Colombier 
3019a747e4fSDavid du Colombier 	case Rwalk9p1:
3029a747e4fSDavid du Colombier 	case Ropen9p1:
3039a747e4fSDavid du Colombier 	case Rcreate9p1:
3049a747e4fSDavid du Colombier 	case Rclwalk9p1:
3059a747e4fSDavid du Colombier 		SHORT(fid);
3069a747e4fSDavid du Colombier 		LONG(qid.path);
3079a747e4fSDavid du Colombier 		LONG(qid.version);
3089a747e4fSDavid du Colombier 		break;
3099a747e4fSDavid du Colombier 
3109a747e4fSDavid du Colombier 	case Rattach9p1:
3119a747e4fSDavid du Colombier 		SHORT(fid);
3129a747e4fSDavid du Colombier 		LONG(qid.path);
3139a747e4fSDavid du Colombier 		LONG(qid.version);
3149a747e4fSDavid du Colombier 		BYTES(rauth, sizeof(f->rauth));
3159a747e4fSDavid du Colombier 		break;
3169a747e4fSDavid du Colombier 
3179a747e4fSDavid du Colombier 	case Roattach9p1:
3189a747e4fSDavid du Colombier 		SHORT(fid);
3199a747e4fSDavid du Colombier 		LONG(qid.path);
3209a747e4fSDavid du Colombier 		LONG(qid.version);
3219a747e4fSDavid du Colombier 		break;
3229a747e4fSDavid du Colombier 
3239a747e4fSDavid du Colombier 	case Rread9p1:
3249a747e4fSDavid du Colombier 		SHORT(fid);
3259a747e4fSDavid du Colombier 		SHORT(count);
3269a747e4fSDavid du Colombier 		p++;
3279a747e4fSDavid du Colombier 		if((uchar*)p == (uchar*)f->data) {
3289a747e4fSDavid du Colombier 			p += f->count;
3299a747e4fSDavid du Colombier 			break;
3309a747e4fSDavid du Colombier 		}
3319a747e4fSDavid du Colombier 		BYTES(data, f->count);
3329a747e4fSDavid du Colombier 		break;
3339a747e4fSDavid du Colombier 
3349a747e4fSDavid du Colombier 	case Rwrite9p1:
3359a747e4fSDavid du Colombier 		SHORT(fid);
3369a747e4fSDavid du Colombier 		SHORT(count);
3379a747e4fSDavid du Colombier 		break;
3389a747e4fSDavid du Colombier 
3399a747e4fSDavid du Colombier 	case Rstat9p1:
3409a747e4fSDavid du Colombier 		SHORT(fid);
3419a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
3429a747e4fSDavid du Colombier 		break;
3439a747e4fSDavid du Colombier 	}
3449a747e4fSDavid du Colombier 	return p - (uchar*)ap;
3459a747e4fSDavid du Colombier }
3469a747e4fSDavid du Colombier 
3479a747e4fSDavid du Colombier int
convD2M9p1(Dir * f,char * ap)3489a747e4fSDavid du Colombier convD2M9p1(Dir *f, char *ap)
3499a747e4fSDavid du Colombier {
3509a747e4fSDavid du Colombier 	uchar *p;
3519a747e4fSDavid du Colombier 	ulong q;
3529a747e4fSDavid du Colombier 
3539a747e4fSDavid du Colombier 	p = (uchar*)ap;
3549a747e4fSDavid du Colombier 	STRING(name, NAMEREC);
3559a747e4fSDavid du Colombier 	STRING(uid, NAMEREC);
3569a747e4fSDavid du Colombier 	STRING(gid, NAMEREC);
3579a747e4fSDavid du Colombier 
3589a747e4fSDavid du Colombier 	q = f->qid.path & ~0x80000000;
3599a747e4fSDavid du Colombier 	if(f->qid.type & QTDIR)
3609a747e4fSDavid du Colombier 		q |= 0x80000000;
3619a747e4fSDavid du Colombier 	VLONG(q);
3629a747e4fSDavid du Colombier 	LONG(qid.vers);
3639a747e4fSDavid du Colombier 	LONG(mode);
3649a747e4fSDavid du Colombier 	LONG(atime);
3659a747e4fSDavid du Colombier 	LONG(mtime);
3669a747e4fSDavid du Colombier 	LONG(length); VLONG(0);
3679a747e4fSDavid du Colombier 	VLONG(0);
3689a747e4fSDavid du Colombier 	return p - (uchar*)ap;
3699a747e4fSDavid du Colombier }
3709a747e4fSDavid du Colombier 
3719a747e4fSDavid du Colombier int
convA2M9p1(Authenticator * f,char * ap,char * key)3729a747e4fSDavid du Colombier convA2M9p1(Authenticator *f, char *ap, char *key)
3739a747e4fSDavid du Colombier {
3749a747e4fSDavid du Colombier 	int n;
3759a747e4fSDavid du Colombier 	uchar *p;
3769a747e4fSDavid du Colombier 
3779a747e4fSDavid du Colombier 	p = (uchar*)ap;
3789a747e4fSDavid du Colombier 	CHAR(num);
3799a747e4fSDavid du Colombier 	STRING(chal, CHALLEN);
3809a747e4fSDavid du Colombier 	LONG(id);
3819a747e4fSDavid du Colombier 	n = p - (uchar*)ap;
3829a747e4fSDavid du Colombier 	if(key)
3839a747e4fSDavid du Colombier 		encrypt(key, ap, n);
3849a747e4fSDavid du Colombier 	return n;
3859a747e4fSDavid du Colombier }
3869a747e4fSDavid du Colombier 
3879a747e4fSDavid du Colombier #undef	CHAR
3889a747e4fSDavid du Colombier #undef	SHORT
3899a747e4fSDavid du Colombier #undef	LONG
3909a747e4fSDavid du Colombier #undef	VLONG
3919a747e4fSDavid du Colombier #undef	BYTES
3929a747e4fSDavid du Colombier #undef	STRING
3939a747e4fSDavid du Colombier 
3949a747e4fSDavid du Colombier #define	CHAR(x)		f->x = *p++
3959a747e4fSDavid du Colombier #define	SHORT(x)	f->x = (p[0] | (p[1]<<8)); p += 2
3969a747e4fSDavid du Colombier #define	VLONG(q)	q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4
3979a747e4fSDavid du Colombier #define	LONG(x)		VLONG(f->x)
3989a747e4fSDavid du Colombier #define	BYTES(x,n)	memmove(f->x, p, n); p += n
3999a747e4fSDavid du Colombier #define	STRING(x,n)	memmove(f->x, p, n); p += n
4009a747e4fSDavid du Colombier 
4019a747e4fSDavid du Colombier int
convM2S9p1(char * ap,Fcall9p1 * f,int n)4029a747e4fSDavid du Colombier convM2S9p1(char *ap, Fcall9p1 *f, int n)
4039a747e4fSDavid du Colombier {
4049a747e4fSDavid du Colombier 	uchar *p;
4059a747e4fSDavid du Colombier 	int t;
4069a747e4fSDavid du Colombier 
4079a747e4fSDavid du Colombier 	p = (uchar*)ap;
4089a747e4fSDavid du Colombier 	CHAR(type);
4099a747e4fSDavid du Colombier 	t = f->type;
4109a747e4fSDavid du Colombier 	SHORT(tag);
4119a747e4fSDavid du Colombier 	switch(t)
4129a747e4fSDavid du Colombier 	{
4139a747e4fSDavid du Colombier 	default:
4149a747e4fSDavid du Colombier 		fprint(2, "convM2S9p1: bad type: %d\n", f->type);
4159a747e4fSDavid du Colombier 		return 0;
4169a747e4fSDavid du Colombier 
4179a747e4fSDavid du Colombier 	case Tnop9p1:
4189a747e4fSDavid du Colombier 	case Tosession9p1:
4199a747e4fSDavid du Colombier 		break;
4209a747e4fSDavid du Colombier 
4219a747e4fSDavid du Colombier 	case Tsession9p1:
4229a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
4239a747e4fSDavid du Colombier 		break;
4249a747e4fSDavid du Colombier 
4259a747e4fSDavid du Colombier 	case Tflush9p1:
4269a747e4fSDavid du Colombier 		SHORT(oldtag);
4279a747e4fSDavid du Colombier 		break;
4289a747e4fSDavid du Colombier 
4299a747e4fSDavid du Colombier 	case Tattach9p1:
4309a747e4fSDavid du Colombier 		SHORT(fid);
4319a747e4fSDavid du Colombier 		BYTES(uname, sizeof(f->uname));
4329a747e4fSDavid du Colombier 		BYTES(aname, sizeof(f->aname));
4339a747e4fSDavid du Colombier 		BYTES(ticket, sizeof(f->ticket));
4349a747e4fSDavid du Colombier 		BYTES(auth, sizeof(f->auth));
4359a747e4fSDavid du Colombier 		break;
4369a747e4fSDavid du Colombier 
4379a747e4fSDavid du Colombier 	case Toattach9p1:
4389a747e4fSDavid du Colombier 		SHORT(fid);
4399a747e4fSDavid du Colombier 		BYTES(uname, sizeof(f->uname));
4409a747e4fSDavid du Colombier 		BYTES(aname, sizeof(f->aname));
4419a747e4fSDavid du Colombier 		BYTES(ticket, NAMEREC);
4429a747e4fSDavid du Colombier 		break;
4439a747e4fSDavid du Colombier 
4449a747e4fSDavid du Colombier 	case Tclone9p1:
4459a747e4fSDavid du Colombier 		SHORT(fid);
4469a747e4fSDavid du Colombier 		SHORT(newfid);
4479a747e4fSDavid du Colombier 		break;
4489a747e4fSDavid du Colombier 
4499a747e4fSDavid du Colombier 	case Twalk9p1:
4509a747e4fSDavid du Colombier 		SHORT(fid);
4519a747e4fSDavid du Colombier 		BYTES(name, sizeof(f->name));
4529a747e4fSDavid du Colombier 		break;
4539a747e4fSDavid du Colombier 
4549a747e4fSDavid du Colombier 	case Tclwalk9p1:
4559a747e4fSDavid du Colombier 		SHORT(fid);
4569a747e4fSDavid du Colombier 		SHORT(newfid);
4579a747e4fSDavid du Colombier 		BYTES(name, sizeof(f->name));
4589a747e4fSDavid du Colombier 		break;
4599a747e4fSDavid du Colombier 
4609a747e4fSDavid du Colombier 	case Tremove9p1:
4619a747e4fSDavid du Colombier 		SHORT(fid);
4629a747e4fSDavid du Colombier 		break;
4639a747e4fSDavid du Colombier 
4649a747e4fSDavid du Colombier 	case Topen9p1:
4659a747e4fSDavid du Colombier 		SHORT(fid);
4669a747e4fSDavid du Colombier 		CHAR(mode);
4679a747e4fSDavid du Colombier 		break;
4689a747e4fSDavid du Colombier 
4699a747e4fSDavid du Colombier 	case Tcreate9p1:
4709a747e4fSDavid du Colombier 		SHORT(fid);
4719a747e4fSDavid du Colombier 		BYTES(name, sizeof(f->name));
4729a747e4fSDavid du Colombier 		LONG(perm);
4739a747e4fSDavid du Colombier 		CHAR(mode);
4749a747e4fSDavid du Colombier 		break;
4759a747e4fSDavid du Colombier 
4769a747e4fSDavid du Colombier 	case Tread9p1:
4779a747e4fSDavid du Colombier 		SHORT(fid);
4789a747e4fSDavid du Colombier 		LONG(offset); p += 4;
4799a747e4fSDavid du Colombier 		SHORT(count);
4809a747e4fSDavid du Colombier 		break;
4819a747e4fSDavid du Colombier 
4829a747e4fSDavid du Colombier 	case Twrite9p1:
4839a747e4fSDavid du Colombier 		SHORT(fid);
4849a747e4fSDavid du Colombier 		LONG(offset); p += 4;
4859a747e4fSDavid du Colombier 		SHORT(count);
4869a747e4fSDavid du Colombier 		p++;
4879a747e4fSDavid du Colombier 		f->data = (char*)p; p += f->count;
4889a747e4fSDavid du Colombier 		break;
4899a747e4fSDavid du Colombier 
4909a747e4fSDavid du Colombier 	case Tclunk9p1:
4919a747e4fSDavid du Colombier 	case Tstat9p1:
4929a747e4fSDavid du Colombier 		SHORT(fid);
4939a747e4fSDavid du Colombier 		break;
4949a747e4fSDavid du Colombier 
4959a747e4fSDavid du Colombier 	case Twstat9p1:
4969a747e4fSDavid du Colombier 		SHORT(fid);
4979a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
4989a747e4fSDavid du Colombier 		break;
4999a747e4fSDavid du Colombier 
5009a747e4fSDavid du Colombier /*
5019a747e4fSDavid du Colombier  */
5029a747e4fSDavid du Colombier 	case Rnop9p1:
5039a747e4fSDavid du Colombier 	case Rosession9p1:
5049a747e4fSDavid du Colombier 		break;
5059a747e4fSDavid du Colombier 
5069a747e4fSDavid du Colombier 	case Rsession9p1:
5079a747e4fSDavid du Colombier 		BYTES(chal, sizeof(f->chal));
5089a747e4fSDavid du Colombier 		BYTES(authid, sizeof(f->authid));
5099a747e4fSDavid du Colombier 		BYTES(authdom, sizeof(f->authdom));
5109a747e4fSDavid du Colombier 		break;
5119a747e4fSDavid du Colombier 
5129a747e4fSDavid du Colombier 	case Rerror9p1:
5139a747e4fSDavid du Colombier 		BYTES(ename, sizeof(f->ename));
5149a747e4fSDavid du Colombier 		break;
5159a747e4fSDavid du Colombier 
5169a747e4fSDavid du Colombier 	case Rflush9p1:
5179a747e4fSDavid du Colombier 		break;
5189a747e4fSDavid du Colombier 
5199a747e4fSDavid du Colombier 	case Rclone9p1:
5209a747e4fSDavid du Colombier 	case Rclunk9p1:
5219a747e4fSDavid du Colombier 	case Rremove9p1:
5229a747e4fSDavid du Colombier 	case Rwstat9p1:
5239a747e4fSDavid du Colombier 		SHORT(fid);
5249a747e4fSDavid du Colombier 		break;
5259a747e4fSDavid du Colombier 
5269a747e4fSDavid du Colombier 	case Rwalk9p1:
5279a747e4fSDavid du Colombier 	case Rclwalk9p1:
5289a747e4fSDavid du Colombier 	case Ropen9p1:
5299a747e4fSDavid du Colombier 	case Rcreate9p1:
5309a747e4fSDavid du Colombier 		SHORT(fid);
5319a747e4fSDavid du Colombier 		LONG(qid.path);
5329a747e4fSDavid du Colombier 		LONG(qid.version);
5339a747e4fSDavid du Colombier 		break;
5349a747e4fSDavid du Colombier 
5359a747e4fSDavid du Colombier 	case Rattach9p1:
5369a747e4fSDavid du Colombier 		SHORT(fid);
5379a747e4fSDavid du Colombier 		LONG(qid.path);
5389a747e4fSDavid du Colombier 		LONG(qid.version);
5399a747e4fSDavid du Colombier 		BYTES(rauth, sizeof(f->rauth));
5409a747e4fSDavid du Colombier 		break;
5419a747e4fSDavid du Colombier 
5429a747e4fSDavid du Colombier 	case Roattach9p1:
5439a747e4fSDavid du Colombier 		SHORT(fid);
5449a747e4fSDavid du Colombier 		LONG(qid.path);
5459a747e4fSDavid du Colombier 		LONG(qid.version);
5469a747e4fSDavid du Colombier 		break;
5479a747e4fSDavid du Colombier 
5489a747e4fSDavid du Colombier 	case Rread9p1:
5499a747e4fSDavid du Colombier 		SHORT(fid);
5509a747e4fSDavid du Colombier 		SHORT(count);
5519a747e4fSDavid du Colombier 		p++;
5529a747e4fSDavid du Colombier 		f->data = (char*)p; p += f->count;
5539a747e4fSDavid du Colombier 		break;
5549a747e4fSDavid du Colombier 
5559a747e4fSDavid du Colombier 	case Rwrite9p1:
5569a747e4fSDavid du Colombier 		SHORT(fid);
5579a747e4fSDavid du Colombier 		SHORT(count);
5589a747e4fSDavid du Colombier 		break;
5599a747e4fSDavid du Colombier 
5609a747e4fSDavid du Colombier 	case Rstat9p1:
5619a747e4fSDavid du Colombier 		SHORT(fid);
5629a747e4fSDavid du Colombier 		BYTES(stat, sizeof(f->stat));
5639a747e4fSDavid du Colombier 		break;
5649a747e4fSDavid du Colombier 	}
5659a747e4fSDavid du Colombier 	if((uchar*)ap+n == p)
5669a747e4fSDavid du Colombier 		return n;
5679a747e4fSDavid du Colombier 	return 0;
5689a747e4fSDavid du Colombier }
5699a747e4fSDavid du Colombier 
5709a747e4fSDavid du Colombier int
convM2D9p1(char * ap,Dir * f)5719a747e4fSDavid du Colombier convM2D9p1(char *ap, Dir *f)
5729a747e4fSDavid du Colombier {
5739a747e4fSDavid du Colombier 	uchar *p;
5749a747e4fSDavid du Colombier 
5759a747e4fSDavid du Colombier 	p = (uchar*)ap;
5769a747e4fSDavid du Colombier 	f->name = (char*)p;
5779a747e4fSDavid du Colombier 	p += NAMEREC;
5789a747e4fSDavid du Colombier 	f->uid = (char*)p;
5799a747e4fSDavid du Colombier 	f->muid = (char*)p;
5809a747e4fSDavid du Colombier 	p += NAMEREC;
5819a747e4fSDavid du Colombier 	f->gid = (char*)p;
5829a747e4fSDavid du Colombier 	p += NAMEREC;
5839a747e4fSDavid du Colombier 
5849a747e4fSDavid du Colombier 	LONG(qid.path);
5859a747e4fSDavid du Colombier 	f->qid.path &= ~0x80000000;
5869a747e4fSDavid du Colombier 
5879a747e4fSDavid du Colombier 	LONG(qid.vers);
5889a747e4fSDavid du Colombier 	LONG(mode);
5899a747e4fSDavid du Colombier 	f->qid.type = f->mode >> 24;
5909a747e4fSDavid du Colombier 	LONG(atime);
5919a747e4fSDavid du Colombier 	LONG(mtime);
5929a747e4fSDavid du Colombier 	LONG(length); p += 4;
5939a747e4fSDavid du Colombier 	p += 4;
5949a747e4fSDavid du Colombier 	return p - (uchar*)ap;
5959a747e4fSDavid du Colombier }
5969a747e4fSDavid du Colombier 
5979a747e4fSDavid du Colombier void
convM2A9p1(char * ap,Authenticator * f,char * key)5989a747e4fSDavid du Colombier convM2A9p1(char *ap, Authenticator *f, char *key)
5999a747e4fSDavid du Colombier {
6009a747e4fSDavid du Colombier 	uchar *p;
6019a747e4fSDavid du Colombier 
6029a747e4fSDavid du Colombier 	if(key)
6039a747e4fSDavid du Colombier 		decrypt(key, ap, AUTHENTLEN);
6049a747e4fSDavid du Colombier 	p = (uchar*)ap;
6059a747e4fSDavid du Colombier 	CHAR(num);
6069a747e4fSDavid du Colombier 	STRING(chal, CHALLEN);
6079a747e4fSDavid du Colombier 	LONG(id);
6089a747e4fSDavid du Colombier 	USED(p);
6099a747e4fSDavid du Colombier }
6109a747e4fSDavid du Colombier 
6119a747e4fSDavid du Colombier void
convM2T9p1(char * ap,Ticket * f,char * key)6129a747e4fSDavid du Colombier convM2T9p1(char *ap, Ticket *f, char *key)
6139a747e4fSDavid du Colombier {
6149a747e4fSDavid du Colombier 	uchar *p;
6159a747e4fSDavid du Colombier 
6169a747e4fSDavid du Colombier 	if(key)
6179a747e4fSDavid du Colombier 		decrypt(key, ap, TICKETLEN);
6189a747e4fSDavid du Colombier 	p = (uchar*)ap;
6199a747e4fSDavid du Colombier 	CHAR(num);
6209a747e4fSDavid du Colombier 	STRING(chal, CHALLEN);
6219a747e4fSDavid du Colombier 	STRING(cuid, NAMEREC);
6229a747e4fSDavid du Colombier 	f->cuid[NAMEREC-1] = 0;
6239a747e4fSDavid du Colombier 	STRING(suid, NAMEREC);
6249a747e4fSDavid du Colombier 	f->suid[NAMEREC-1] = 0;
6259a747e4fSDavid du Colombier 	STRING(key, DESKEYLEN);
6269a747e4fSDavid du Colombier 	USED(p);
6279a747e4fSDavid du Colombier };
628