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