1*8ccd4a63SDavid du Colombier /* 2*8ccd4a63SDavid du Colombier * exportfs.h - definitions for exporting file server 3*8ccd4a63SDavid du Colombier */ 4*8ccd4a63SDavid du Colombier 5*8ccd4a63SDavid du Colombier #define DEBUG if(!dbg){}else fprint 6*8ccd4a63SDavid du Colombier #define DFD 2 7*8ccd4a63SDavid du Colombier #define fidhash(s) fhash[s%FHASHSIZE] 8*8ccd4a63SDavid du Colombier 9*8ccd4a63SDavid du Colombier #define Proc Exproc 10*8ccd4a63SDavid du Colombier 11*8ccd4a63SDavid du Colombier 12*8ccd4a63SDavid du Colombier typedef struct Fsrpc Fsrpc; 13*8ccd4a63SDavid du Colombier typedef struct Fid Fid; 14*8ccd4a63SDavid du Colombier typedef struct File File; 15*8ccd4a63SDavid du Colombier typedef struct Proc Proc; 16*8ccd4a63SDavid du Colombier typedef struct Qidtab Qidtab; 17*8ccd4a63SDavid du Colombier 18*8ccd4a63SDavid du Colombier struct Fsrpc 19*8ccd4a63SDavid du Colombier { 20*8ccd4a63SDavid du Colombier int busy; /* Work buffer has pending rpc to service */ 21*8ccd4a63SDavid du Colombier int pid; /* Pid of slave process executing the rpc */ 22*8ccd4a63SDavid du Colombier int canint; /* Interrupt gate */ 23*8ccd4a63SDavid du Colombier int flushtag; /* Tag on which to reply to flush */ 24*8ccd4a63SDavid du Colombier Fcall work; /* Plan 9 incoming Fcall */ 25*8ccd4a63SDavid du Colombier uchar *buf; /* Data buffer */ 26*8ccd4a63SDavid du Colombier }; 27*8ccd4a63SDavid du Colombier 28*8ccd4a63SDavid du Colombier struct Fid 29*8ccd4a63SDavid du Colombier { 30*8ccd4a63SDavid du Colombier int fid; /* system fd for i/o */ 31*8ccd4a63SDavid du Colombier File *f; /* File attached to this fid */ 32*8ccd4a63SDavid du Colombier int mode; 33*8ccd4a63SDavid du Colombier int nr; /* fid number */ 34*8ccd4a63SDavid du Colombier int mid; /* Mount id */ 35*8ccd4a63SDavid du Colombier Fid *next; /* hash link */ 36*8ccd4a63SDavid du Colombier }; 37*8ccd4a63SDavid du Colombier 38*8ccd4a63SDavid du Colombier struct File 39*8ccd4a63SDavid du Colombier { 40*8ccd4a63SDavid du Colombier char *name; 41*8ccd4a63SDavid du Colombier int ref; 42*8ccd4a63SDavid du Colombier Qid qid; 43*8ccd4a63SDavid du Colombier Qidtab *qidt; 44*8ccd4a63SDavid du Colombier int inval; 45*8ccd4a63SDavid du Colombier File *parent; 46*8ccd4a63SDavid du Colombier File *child; 47*8ccd4a63SDavid du Colombier File *childlist; 48*8ccd4a63SDavid du Colombier }; 49*8ccd4a63SDavid du Colombier 50*8ccd4a63SDavid du Colombier struct Proc 51*8ccd4a63SDavid du Colombier { 52*8ccd4a63SDavid du Colombier int pid; 53*8ccd4a63SDavid du Colombier int busy; 54*8ccd4a63SDavid du Colombier Proc *next; 55*8ccd4a63SDavid du Colombier }; 56*8ccd4a63SDavid du Colombier 57*8ccd4a63SDavid du Colombier struct Qidtab 58*8ccd4a63SDavid du Colombier { 59*8ccd4a63SDavid du Colombier int ref; 60*8ccd4a63SDavid du Colombier int type; 61*8ccd4a63SDavid du Colombier int dev; 62*8ccd4a63SDavid du Colombier vlong path; 63*8ccd4a63SDavid du Colombier vlong uniqpath; 64*8ccd4a63SDavid du Colombier Qidtab *next; 65*8ccd4a63SDavid du Colombier }; 66*8ccd4a63SDavid du Colombier 67*8ccd4a63SDavid du Colombier enum 68*8ccd4a63SDavid du Colombier { 69*8ccd4a63SDavid du Colombier MAXPROC = 50, 70*8ccd4a63SDavid du Colombier FHASHSIZE = 64, 71*8ccd4a63SDavid du Colombier Nr_workbufs = 50, 72*8ccd4a63SDavid du Colombier Fidchunk = 1000, 73*8ccd4a63SDavid du Colombier Npsmpt = 32, 74*8ccd4a63SDavid du Colombier Nqidbits = 5, 75*8ccd4a63SDavid du Colombier Nqidtab = (1<<Nqidbits), 76*8ccd4a63SDavid du Colombier }; 77*8ccd4a63SDavid du Colombier 78*8ccd4a63SDavid du Colombier #define Enomem Exenomem 79*8ccd4a63SDavid du Colombier #define Ebadfix Exebadfid 80*8ccd4a63SDavid du Colombier #define Enotdir Exenotdir 81*8ccd4a63SDavid du Colombier #define Edupfid Exedupfid 82*8ccd4a63SDavid du Colombier #define Eopen Exeopen 83*8ccd4a63SDavid du Colombier #define Exmnt Exexmnt 84*8ccd4a63SDavid du Colombier #define Emip Exemip 85*8ccd4a63SDavid du Colombier #define Enopsmt Exenopsmt 86*8ccd4a63SDavid du Colombier 87*8ccd4a63SDavid du Colombier extern char Ebadfid[]; 88*8ccd4a63SDavid du Colombier extern char Enotdir[]; 89*8ccd4a63SDavid du Colombier extern char Edupfid[]; 90*8ccd4a63SDavid du Colombier extern char Eopen[]; 91*8ccd4a63SDavid du Colombier extern char Exmnt[]; 92*8ccd4a63SDavid du Colombier extern char Enomem[]; 93*8ccd4a63SDavid du Colombier extern char Emip[]; 94*8ccd4a63SDavid du Colombier extern char Enopsmt[]; 95*8ccd4a63SDavid du Colombier 96*8ccd4a63SDavid du Colombier Extern Fsrpc *Workq; 97*8ccd4a63SDavid du Colombier Extern int dbg; 98*8ccd4a63SDavid du Colombier Extern File *root; 99*8ccd4a63SDavid du Colombier Extern File *psmpt; 100*8ccd4a63SDavid du Colombier Extern Fid **fhash; 101*8ccd4a63SDavid du Colombier Extern Fid *fidfree; 102*8ccd4a63SDavid du Colombier Extern Proc *Proclist; 103*8ccd4a63SDavid du Colombier Extern char psmap[Npsmpt]; 104*8ccd4a63SDavid du Colombier Extern Qidtab *qidtab[Nqidtab]; 105*8ccd4a63SDavid du Colombier Extern ulong messagesize; 106*8ccd4a63SDavid du Colombier Extern int srvfd; 107*8ccd4a63SDavid du Colombier 108*8ccd4a63SDavid du Colombier /* File system protocol service procedures */ 109*8ccd4a63SDavid du Colombier void Xattach(Fsrpc*); 110*8ccd4a63SDavid du Colombier void Xauth(Fsrpc*); 111*8ccd4a63SDavid du Colombier void Xclunk(Fsrpc*); 112*8ccd4a63SDavid du Colombier void Xcreate(Fsrpc*); 113*8ccd4a63SDavid du Colombier void Xflush(Fsrpc*); 114*8ccd4a63SDavid du Colombier void Xnop(Fsrpc*); 115*8ccd4a63SDavid du Colombier void Xremove(Fsrpc*); 116*8ccd4a63SDavid du Colombier void Xstat(Fsrpc*); 117*8ccd4a63SDavid du Colombier void Xversion(Fsrpc*); 118*8ccd4a63SDavid du Colombier void Xwalk(Fsrpc*); 119*8ccd4a63SDavid du Colombier void Xwstat(Fsrpc*); 120*8ccd4a63SDavid du Colombier void slave(Fsrpc*); 121*8ccd4a63SDavid du Colombier 122*8ccd4a63SDavid du Colombier void reply(Fcall*, Fcall*, char*); 123*8ccd4a63SDavid du Colombier Fid *getfid(int); 124*8ccd4a63SDavid du Colombier int freefid(int); 125*8ccd4a63SDavid du Colombier Fid *newfid(int); 126*8ccd4a63SDavid du Colombier Fsrpc *getsbuf(void); 127*8ccd4a63SDavid du Colombier void initroot(void); 128*8ccd4a63SDavid du Colombier void fatal(char*, ...); 129*8ccd4a63SDavid du Colombier char* makepath(File*, char*); 130*8ccd4a63SDavid du Colombier File *file(File*, char*); 131*8ccd4a63SDavid du Colombier void freefile(File*); 132*8ccd4a63SDavid du Colombier void slaveopen(Fsrpc*); 133*8ccd4a63SDavid du Colombier void slaveread(Fsrpc*); 134*8ccd4a63SDavid du Colombier void slavewrite(Fsrpc*); 135*8ccd4a63SDavid du Colombier void blockingslave(void*); 136*8ccd4a63SDavid du Colombier void reopen(Fid *f); 137*8ccd4a63SDavid du Colombier void noteproc(int, char*); 138*8ccd4a63SDavid du Colombier void flushaction(void*, char*); 139*8ccd4a63SDavid du Colombier void pushfcall(char*); 140*8ccd4a63SDavid du Colombier Qidtab* uniqueqid(Dir*); 141*8ccd4a63SDavid du Colombier void freeqid(Qidtab*); 142*8ccd4a63SDavid du Colombier char* estrdup(char*); 143*8ccd4a63SDavid du Colombier void* emallocz(uint); 144*8ccd4a63SDavid du Colombier int readmessage(int, char*, int); 145*8ccd4a63SDavid du Colombier 146*8ccd4a63SDavid du Colombier #define notify(x) 147*8ccd4a63SDavid du Colombier #define noted(x) 148*8ccd4a63SDavid du Colombier #define exits(x) 149