123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- #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;
- }
|