13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * exportfs.h - definitions for exporting file server 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier 59a747e4fSDavid du Colombier #define DEBUG if(!dbg){}else fprint 67dd7cddfSDavid du Colombier #define DFD 9 73e12c5d1SDavid du Colombier #define fidhash(s) fhash[s%FHASHSIZE] 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier typedef struct Fsrpc Fsrpc; 103e12c5d1SDavid du Colombier typedef struct Fid Fid; 113e12c5d1SDavid du Colombier typedef struct File File; 123e12c5d1SDavid du Colombier typedef struct Proc Proc; 137dd7cddfSDavid du Colombier typedef struct Qidtab Qidtab; 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier struct Fsrpc 163e12c5d1SDavid du Colombier { 173e12c5d1SDavid du Colombier int busy; /* Work buffer has pending rpc to service */ 18*74f16c81SDavid du Colombier uintptr pid; /* Pid of slave process executing the rpc */ 193e12c5d1SDavid du Colombier int canint; /* Interrupt gate */ 203e12c5d1SDavid du Colombier int flushtag; /* Tag on which to reply to flush */ 213e12c5d1SDavid du Colombier Fcall work; /* Plan 9 incoming Fcall */ 229a747e4fSDavid du Colombier uchar *buf; /* Data buffer */ 233e12c5d1SDavid du Colombier }; 243e12c5d1SDavid du Colombier 253e12c5d1SDavid du Colombier struct Fid 263e12c5d1SDavid du Colombier { 273e12c5d1SDavid du Colombier int fid; /* system fd for i/o */ 283e12c5d1SDavid du Colombier File *f; /* File attached to this fid */ 293e12c5d1SDavid du Colombier int mode; 303e12c5d1SDavid du Colombier int nr; /* fid number */ 31219b2ee8SDavid du Colombier int mid; /* Mount id */ 323e12c5d1SDavid du Colombier Fid *next; /* hash link */ 33a960ed1cSDavid du Colombier 34a960ed1cSDavid du Colombier /* for preaddir -- ARRGH! */ 35a960ed1cSDavid du Colombier Dir *dir; /* buffer for reading directories */ 36a960ed1cSDavid du Colombier int ndir; /* number of entries in dir */ 37a960ed1cSDavid du Colombier int cdir; /* number of consumed entries in dir */ 38a960ed1cSDavid du Colombier int gdir; /* glue index */ 39a960ed1cSDavid du Colombier vlong offset; /* offset in virtual directory */ 403e12c5d1SDavid du Colombier }; 413e12c5d1SDavid du Colombier 423e12c5d1SDavid du Colombier struct File 433e12c5d1SDavid du Colombier { 449a747e4fSDavid du Colombier char *name; 457dd7cddfSDavid du Colombier int ref; 463e12c5d1SDavid du Colombier Qid qid; 477dd7cddfSDavid du Colombier Qidtab *qidt; 487dd7cddfSDavid du Colombier int inval; 493e12c5d1SDavid du Colombier File *parent; 503e12c5d1SDavid du Colombier File *child; 513e12c5d1SDavid du Colombier File *childlist; 523e12c5d1SDavid du Colombier }; 533e12c5d1SDavid du Colombier 543e12c5d1SDavid du Colombier struct Proc 553e12c5d1SDavid du Colombier { 56*74f16c81SDavid du Colombier uintptr pid; 573e12c5d1SDavid du Colombier int busy; 583e12c5d1SDavid du Colombier Proc *next; 593e12c5d1SDavid du Colombier }; 603e12c5d1SDavid du Colombier 617dd7cddfSDavid du Colombier struct Qidtab 627dd7cddfSDavid du Colombier { 637dd7cddfSDavid du Colombier int ref; 647dd7cddfSDavid du Colombier int type; 657dd7cddfSDavid du Colombier int dev; 669a747e4fSDavid du Colombier vlong path; 679a747e4fSDavid du Colombier vlong uniqpath; 687dd7cddfSDavid du Colombier Qidtab *next; 697dd7cddfSDavid du Colombier }; 707dd7cddfSDavid du Colombier 713e12c5d1SDavid du Colombier enum 723e12c5d1SDavid du Colombier { 7380ee5cbfSDavid du Colombier MAXPROC = 50, 74219b2ee8SDavid du Colombier FHASHSIZE = 64, 7580ee5cbfSDavid du Colombier Nr_workbufs = 50, 763e12c5d1SDavid du Colombier Fidchunk = 1000, 77219b2ee8SDavid du Colombier Npsmpt = 32, 787dd7cddfSDavid du Colombier Nqidbits = 5, 797dd7cddfSDavid du Colombier Nqidtab = (1<<Nqidbits), 803e12c5d1SDavid du Colombier }; 813e12c5d1SDavid du Colombier 829a747e4fSDavid du Colombier char Ebadfid[]; 839a747e4fSDavid du Colombier char Enotdir[]; 849a747e4fSDavid du Colombier char Edupfid[]; 859a747e4fSDavid du Colombier char Eopen[]; 869a747e4fSDavid du Colombier char Exmnt[]; 879a747e4fSDavid du Colombier char Enomem[]; 889a747e4fSDavid du Colombier char Emip[]; 899a747e4fSDavid du Colombier char Enopsmt[]; 903e12c5d1SDavid du Colombier 913e12c5d1SDavid du Colombier Extern Fsrpc *Workq; 923e12c5d1SDavid du Colombier Extern int dbg; 933e12c5d1SDavid du Colombier Extern File *root; 94219b2ee8SDavid du Colombier Extern File *psmpt; 953e12c5d1SDavid du Colombier Extern Fid **fhash; 963e12c5d1SDavid du Colombier Extern Fid *fidfree; 973e12c5d1SDavid du Colombier Extern Proc *Proclist; 98219b2ee8SDavid du Colombier Extern char psmap[Npsmpt]; 997dd7cddfSDavid du Colombier Extern Qidtab *qidtab[Nqidtab]; 1009a747e4fSDavid du Colombier Extern ulong messagesize; 1019a747e4fSDavid du Colombier Extern char Enomem[]; 1029a747e4fSDavid du Colombier Extern int srvfd; 103a960ed1cSDavid du Colombier Extern char* patternfile; 1043e12c5d1SDavid du Colombier 1053e12c5d1SDavid du Colombier /* File system protocol service procedures */ 1063e12c5d1SDavid du Colombier void Xattach(Fsrpc*); 1073e12c5d1SDavid du Colombier void Xauth(Fsrpc*); 1083e12c5d1SDavid du Colombier void Xclunk(Fsrpc*); 1093e12c5d1SDavid du Colombier void Xcreate(Fsrpc*); 1103e12c5d1SDavid du Colombier void Xflush(Fsrpc*); 1113e12c5d1SDavid du Colombier void Xnop(Fsrpc*); 1123e12c5d1SDavid du Colombier void Xremove(Fsrpc*); 1133e12c5d1SDavid du Colombier void Xstat(Fsrpc*); 1149a747e4fSDavid du Colombier void Xversion(Fsrpc*); 1153e12c5d1SDavid du Colombier void Xwalk(Fsrpc*); 1163e12c5d1SDavid du Colombier void Xwstat(Fsrpc*); 1173e12c5d1SDavid du Colombier void slave(Fsrpc*); 1183e12c5d1SDavid du Colombier 1193e12c5d1SDavid du Colombier void reply(Fcall*, Fcall*, char*); 1203e12c5d1SDavid du Colombier Fid *getfid(int); 1213e12c5d1SDavid du Colombier int freefid(int); 1223e12c5d1SDavid du Colombier Fid *newfid(int); 1233e12c5d1SDavid du Colombier Fsrpc *getsbuf(void); 1243e12c5d1SDavid du Colombier void initroot(void); 1259a747e4fSDavid du Colombier void fatal(char*, ...); 1269a747e4fSDavid du Colombier char* makepath(File*, char*); 1273e12c5d1SDavid du Colombier File *file(File*, char*); 1287dd7cddfSDavid du Colombier void freefile(File*); 1293e12c5d1SDavid du Colombier void slaveopen(Fsrpc*); 1303e12c5d1SDavid du Colombier void slaveread(Fsrpc*); 1313e12c5d1SDavid du Colombier void slavewrite(Fsrpc*); 1323e12c5d1SDavid du Colombier void blockingslave(void); 1333e12c5d1SDavid du Colombier void reopen(Fid *f); 1343e12c5d1SDavid du Colombier void noteproc(int, char*); 1353e12c5d1SDavid du Colombier void flushaction(void*, char*); 1363e12c5d1SDavid du Colombier void pushfcall(char*); 1377dd7cddfSDavid du Colombier Qidtab* uniqueqid(Dir*); 1387dd7cddfSDavid du Colombier void freeqid(Qidtab*); 1399a747e4fSDavid du Colombier char* estrdup(char*); 1409a747e4fSDavid du Colombier void* emallocz(uint); 1419a747e4fSDavid du Colombier int readmessage(int, char*, int); 142a960ed1cSDavid du Colombier void exclusions(void); 143a960ed1cSDavid du Colombier int excludefile(char*); 144a960ed1cSDavid du Colombier int preaddir(Fid*, uchar*, int, vlong); 145