ref: 26e00d014cebde8bc07725700b5ac9c0cade8171
dir: /sys/src/ape/lib/ap/plan9/_fcall.c/
#include <string.h> #include "sys9.h" #include "lib.h" #include "dir.h" #include "fcall.h" typedef unsigned char uchar; #define CHAR(x) *p++ = f->x #define SHORT(x) p[0] = f->x; p[1] = f->x>>8; p += 2 #define LONG(x) p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24; p += 4 #define VLONG(x) p[0] = f->x; p[1] = f->x>>8; p[2] = f->x>>16; p[3] = f->x>>24;\ p[4] = 0; p[5] = 0; p[6] = 0; p[7] = 0; p += 8 #define STRING(x,n) memcpy(p, f->x, n); p += n int convS2M(Fcall *f, char *ap) { uchar *p; p = (uchar*)ap; CHAR(type); SHORT(tag); switch(f->type) { default: return 0; case Tosession: case Tnop: break; case Tsession: STRING(chal, sizeof(f->chal)); break; case Tflush: SHORT(oldtag); break; case Tattach: SHORT(fid); STRING(uname, sizeof(f->uname)); STRING(aname, sizeof(f->aname)); STRING(ticket, sizeof(f->ticket)); STRING(auth, sizeof(f->auth)); break; case Toattach: SHORT(fid); STRING(uname, sizeof(f->uname)); STRING(aname, sizeof(f->aname)); STRING(ticket, NAMELEN); break; case Tauth: SHORT(fid); STRING(uname, sizeof(f->uname)); STRING(ticket, 8+NAMELEN); break; case Tclone: SHORT(fid); SHORT(newfid); break; case Twalk: SHORT(fid); STRING(name, sizeof(f->name)); break; case Topen: SHORT(fid); CHAR(mode); break; case Tcreate: SHORT(fid); STRING(name, sizeof(f->name)); LONG(perm); CHAR(mode); break; case Tread: SHORT(fid); VLONG(offset); SHORT(count); break; case Twrite: SHORT(fid); VLONG(offset); SHORT(count); p++; /* pad(1) */ STRING(data, f->count); break; case Tclunk: SHORT(fid); break; case Tremove: SHORT(fid); break; case Tstat: SHORT(fid); break; case Twstat: SHORT(fid); STRING(stat, sizeof(f->stat)); break; case Tclwalk: SHORT(fid); SHORT(newfid); STRING(name, sizeof(f->name)); break; /* */ case Rosession: case Rnop: break; case Rsession: STRING(chal, sizeof(f->chal)); STRING(authid, sizeof(f->authid)); STRING(authdom, sizeof(f->authdom)); break; case Rerror: STRING(ename, sizeof(f->ename)); break; case Rflush: break; case Rattach: SHORT(fid); LONG(qid.path); LONG(qid.vers); STRING(rauth, sizeof(f->rauth)); break; case Roattach: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Rauth: SHORT(fid); STRING(ticket, 8+8+7+7); break; case Rclone: SHORT(fid); break; case Rwalk: case Rclwalk: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Ropen: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Rcreate: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Rread: SHORT(fid); SHORT(count); p++; /* pad(1) */ STRING(data, f->count); break; case Rwrite: SHORT(fid); SHORT(count); break; case Rclunk: SHORT(fid); break; case Rremove: SHORT(fid); break; case Rstat: SHORT(fid); STRING(stat, sizeof(f->stat)); break; case Rwstat: SHORT(fid); break; } return p - (uchar*)ap; } #undef CHAR #undef SHORT #undef LONG #undef VLONG #undef STRING #define CHAR(x) f->x = *p++ #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 #define LONG(x) f->x = (p[0] | (p[1]<<8) |\ (p[2]<<16) | (p[3]<<24)); p += 4 #define VLONG(x) f->x = (p[0] | (p[1]<<8) |\ (p[2]<<16) | (p[3]<<24)); p += 8 #define STRING(x,n) memcpy(f->x, p, n); p += n int convM2S(char *ap, Fcall *f, int n) { uchar *p; p = (uchar*)ap; CHAR(type); SHORT(tag); switch(f->type) { default: return 0; case Tnop: case Tosession: break; case Tsession: STRING(chal, sizeof(f->chal)); break; case Tflush: SHORT(oldtag); break; case Tattach: SHORT(fid); STRING(uname, sizeof(f->uname)); STRING(aname, sizeof(f->aname)); STRING(ticket, sizeof(f->ticket)); STRING(auth, sizeof(f->auth)); break; case Toattach: SHORT(fid); STRING(uname, sizeof(f->uname)); STRING(aname, sizeof(f->aname)); STRING(ticket, NAMELEN); break; case Tauth: SHORT(fid); STRING(uname, sizeof(f->uname)); STRING(ticket, 8+NAMELEN); break; case Tclone: SHORT(fid); SHORT(newfid); break; case Twalk: SHORT(fid); STRING(name, sizeof(f->name)); break; case Topen: SHORT(fid); CHAR(mode); break; case Tcreate: SHORT(fid); STRING(name, sizeof(f->name)); LONG(perm); CHAR(mode); break; case Tread: SHORT(fid); VLONG(offset); SHORT(count); break; case Twrite: SHORT(fid); VLONG(offset); SHORT(count); p++; /* pad(1) */ f->data = (char*)p; p += f->count; break; case Tclunk: SHORT(fid); break; case Tremove: SHORT(fid); break; case Tstat: SHORT(fid); break; case Twstat: SHORT(fid); STRING(stat, sizeof(f->stat)); break; case Tclwalk: SHORT(fid); SHORT(newfid); STRING(name, sizeof(f->name)); break; /* */ case Rnop: case Rosession: break; case Rsession: STRING(chal, sizeof(f->chal)); STRING(authid, sizeof(f->authid)); STRING(authdom, sizeof(f->authdom)); break; case Rerror: STRING(ename, sizeof(f->ename)); break; case Rflush: break; case Rattach: SHORT(fid); LONG(qid.path); LONG(qid.vers); STRING(rauth, sizeof(f->rauth)); break; case Roattach: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Rauth: SHORT(fid); STRING(ticket, 8+8+7+7); break; case Rclone: SHORT(fid); break; case Rwalk: case Rclwalk: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Ropen: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Rcreate: SHORT(fid); LONG(qid.path); LONG(qid.vers); break; case Rread: SHORT(fid); SHORT(count); p++; /* pad(1) */ f->data = (char*)p; p += f->count; break; case Rwrite: SHORT(fid); SHORT(count); break; case Rclunk: SHORT(fid); break; case Rremove: SHORT(fid); break; case Rstat: SHORT(fid); STRING(stat, sizeof(f->stat)); break; case Rwstat: SHORT(fid); break; } if((uchar*)ap+n == p) return n; return 0; }