enum
{
FHSIZE = 32
};
typedef struct Accept Accept;
typedef struct Auth Auth;
typedef struct Authunix Authunix;
typedef struct Chalstuff Chalstuff;
typedef uchar Fhandle[FHSIZE];
typedef struct Fid Fid;
typedef struct Procmap Procmap;
typedef struct Progmap Progmap;
typedef struct Reject Reject;
typedef struct Rpccall Rpccall;
typedef struct Rpccache Rpccache;
typedef struct Sattr Sattr;
typedef struct Session Session;
typedef struct String String;
typedef struct Strnode Strnode;
typedef struct Unixid Unixid;
typedef struct Unixidmap Unixidmap;
typedef struct Unixmap Unixmap;
typedef struct Unixscmap Unixscmap;
typedef struct Xfid Xfid;
typedef struct Xfile Xfile;
struct String
{
ulong n;
char * s;
};
struct Progmap
{
int progno;
int vers;
void (*init)(int, char**);
Procmap *pmap;
};
struct Procmap
{
int procno;
int (*procp)(int, Rpccall*, Rpccall*);
};
struct Auth
{
ulong flavor;
ulong count;
void * data;
};
struct Authunix
{
ulong stamp;
String mach;
ulong uid;
ulong gid;
int gidlen;
ulong gids[10];
};
struct Accept
{
Auth averf;
ulong astat;
union{
void * results; /* SUCCESS */
struct{ /* PROG_MISMATCH */
ulong plow; /* acceptable version numbers */
ulong phigh;
};
};
};
struct Reject
{
ulong rstat;
union{
struct{ /* RPC_MISMATCH */
ulong rlow; /* acceptable rpc version numbers */
ulong rhigh;
};
ulong authstat; /* AUTH_ERROR */
};
};
struct Rpccall
{
uchar prefix0[12];
ulong host; /* prefixed to RPC message */
uchar prefix1[12];
ulong lhost; /* prefixed to RPC message */
ulong port; /* prefixed to RPC message */
ulong lport; /* prefixed to RPC message */
ulong xid; /* transaction id */
ulong mtype; /* CALL or REPLY */
union{
struct{ /* CALL */
ulong rpcvers; /* must be equal to two (2) */
ulong prog; /* program number */
ulong vers; /* program version */
ulong proc; /* procedure number */
Auth cred; /* authentication credentials */
Auth verf; /* authentication verifier */
Unixidmap *up;
char * user;
void * args; /* procedure-specific */
};
struct{ /* REPLY */
ulong stat; /* MSG_ACCEPTED or MSG_DENIED */
union{
Accept;
Reject;
};
};
};
};
struct Rpccache
{
Rpccache *prev;
Rpccache *next;
ulong host;
ulong port;
ulong xid;
int n;
uchar data[4];
};
struct Sattr
{
ulong mode;
ulong uid;
ulong gid;
ulong size;
ulong atime; /* sec's */
ulong ausec; /* microsec's */
ulong mtime;
ulong musec;
};
struct Strnode
{
Strnode *next; /* in hash bucket */
char str[4];
};
struct Unixid
{
Unixid *next;
char * name;
int id;
};
struct Unixmap
{
char * file;
int style;
long timestamp;
Unixid *ids;
};
struct Unixidmap
{
Unixidmap *next;
int flag;
char * server;
char * client;
Reprog *sexp;
Reprog *cexp;
Unixmap u;
Unixmap g;
};
struct Unixscmap
{
Unixscmap *next;
char * server;
ulong clientip;
Unixidmap *map;
};
struct Xfile
{
Xfile * next; /* hash chain */
Session *s;
Qid qid; /* from stat */
Xfile * parent;
Xfile * child; /* if directory */
Xfile * sib; /* siblings */
char * name; /* path element */
Xfid * users;
};
enum
{
Oread = 1,
Owrite = 2,
Open = 3,
Trunc = 4
};
struct Xfid
{
Xfid * next; /* Xfile's user list */
Xfile * xp;
char * uid;
Fid * urfid;
Fid * opfid;
ulong mode; /* open mode, if opfid is non-zero */
ulong offset;
};
struct Fid
{
Fid ** owner; /* null for root fids */
Fid * prev;
Fid * next;
long tstale; /* auto-clunk */
};
enum
{
Maxfdata = 8192,
Maxstatdata = 2048,
};
struct Session
{
Session *next;
char * service; /* for dial */
int fd;
#define CHALLEN 1
char cchal[CHALLEN]; /* client challenge */
char schal[CHALLEN]; /* server challenge */
char authid[ANAMELEN]; /* server encryption uid */
char authdom[DOMLEN]; /* server encryption domain */
char * spec; /* for attach */
Xfile * root; /* to answer mount rpc */
ushort tag;
Fcall f;
uchar data[IOHDRSZ+Maxfdata];
uchar statbuf[Maxstatdata];
Fid * free; /* available */
Fid list; /* active, most-recently-used order */
Fid fids[1000];
int noauth;
};
struct Chalstuff
{
Chalstuff *next;
Xfid * xf;
long tstale;
Chalstate;
};
extern int rpcdebug;
extern int p9debug;
extern int chatty;
extern void (*rpcalarm)(void);
extern long starttime;
extern long nfstime;
extern char * config;
extern int staletime;
extern int messagesize;
extern char * commonopts;
|