Blame | Last modification | View Log | RSS feed
#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;
}