Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

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
{
        /* corresponds to Udphdr */
        uchar   prefix0[12];
        ulong   host;           /* ipv4 subset: prefixed to RPC message */
        uchar   prefix1[12];
        ulong   lhost;          /* ipv4 subset: prefixed to RPC message */
        /* ignore ifcaddr */
        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;