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 { 17*61b17cc6SDavid du Colombier Fsrpc *next; /* freelist */ 183e12c5d1SDavid du Colombier int flushtag; /* Tag on which to reply to flush */ 193e12c5d1SDavid du Colombier Fcall work; /* Plan 9 incoming Fcall */ 20*61b17cc6SDavid du Colombier uchar buf[]; /* Data buffer */ 213e12c5d1SDavid du Colombier }; 223e12c5d1SDavid du Colombier 233e12c5d1SDavid du Colombier struct Fid 243e12c5d1SDavid du Colombier { 253e12c5d1SDavid du Colombier int fid; /* system fd for i/o */ 263e12c5d1SDavid du Colombier File *f; /* File attached to this fid */ 273e12c5d1SDavid du Colombier int mode; 283e12c5d1SDavid du Colombier int nr; /* fid number */ 29219b2ee8SDavid du Colombier int mid; /* Mount id */ 303e12c5d1SDavid du Colombier Fid *next; /* hash link */ 31a960ed1cSDavid du Colombier 32a960ed1cSDavid du Colombier /* for preaddir -- ARRGH! */ 33a960ed1cSDavid du Colombier Dir *dir; /* buffer for reading directories */ 34a960ed1cSDavid du Colombier int ndir; /* number of entries in dir */ 35a960ed1cSDavid du Colombier int cdir; /* number of consumed entries in dir */ 36a960ed1cSDavid du Colombier int gdir; /* glue index */ 37a960ed1cSDavid du Colombier vlong offset; /* offset in virtual directory */ 383e12c5d1SDavid du Colombier }; 393e12c5d1SDavid du Colombier 403e12c5d1SDavid du Colombier struct File 413e12c5d1SDavid du Colombier { 429a747e4fSDavid du Colombier char *name; 437dd7cddfSDavid du Colombier int ref; 443e12c5d1SDavid du Colombier Qid qid; 457dd7cddfSDavid du Colombier Qidtab *qidt; 467dd7cddfSDavid du Colombier int inval; 473e12c5d1SDavid du Colombier File *parent; 483e12c5d1SDavid du Colombier File *child; 493e12c5d1SDavid du Colombier File *childlist; 503e12c5d1SDavid du Colombier }; 513e12c5d1SDavid du Colombier 523e12c5d1SDavid du Colombier struct Proc 533e12c5d1SDavid du Colombier { 54*61b17cc6SDavid du Colombier Lock; 55*61b17cc6SDavid du Colombier Fsrpc *busy; 563e12c5d1SDavid du Colombier Proc *next; 57*61b17cc6SDavid du Colombier int pid; 583e12c5d1SDavid du Colombier }; 593e12c5d1SDavid du Colombier 607dd7cddfSDavid du Colombier struct Qidtab 617dd7cddfSDavid du Colombier { 627dd7cddfSDavid du Colombier int ref; 637dd7cddfSDavid du Colombier int type; 647dd7cddfSDavid du Colombier int dev; 659a747e4fSDavid du Colombier vlong path; 669a747e4fSDavid du Colombier vlong uniqpath; 677dd7cddfSDavid du Colombier Qidtab *next; 687dd7cddfSDavid du Colombier }; 697dd7cddfSDavid du Colombier 703e12c5d1SDavid du Colombier enum 713e12c5d1SDavid du Colombier { 72219b2ee8SDavid du Colombier FHASHSIZE = 64, 733e12c5d1SDavid du Colombier Fidchunk = 1000, 74219b2ee8SDavid du Colombier Npsmpt = 32, 757dd7cddfSDavid du Colombier Nqidbits = 5, 767dd7cddfSDavid du Colombier Nqidtab = (1<<Nqidbits), 773e12c5d1SDavid du Colombier }; 783e12c5d1SDavid du Colombier 799a747e4fSDavid du Colombier char Ebadfid[]; 809a747e4fSDavid du Colombier char Enotdir[]; 819a747e4fSDavid du Colombier char Edupfid[]; 829a747e4fSDavid du Colombier char Eopen[]; 839a747e4fSDavid du Colombier char Enomem[]; 849a747e4fSDavid du Colombier char Emip[]; 859a747e4fSDavid du Colombier char Enopsmt[]; 863e12c5d1SDavid du Colombier 873e12c5d1SDavid du Colombier Extern int dbg; 883e12c5d1SDavid du Colombier Extern File *root; 89219b2ee8SDavid du Colombier Extern File *psmpt; 903e12c5d1SDavid du Colombier Extern Fid **fhash; 913e12c5d1SDavid du Colombier Extern Fid *fidfree; 923e12c5d1SDavid du Colombier Extern Proc *Proclist; 93219b2ee8SDavid du Colombier Extern char psmap[Npsmpt]; 947dd7cddfSDavid du Colombier Extern Qidtab *qidtab[Nqidtab]; 959a747e4fSDavid du Colombier Extern ulong messagesize; 969a747e4fSDavid du Colombier Extern char Enomem[]; 979a747e4fSDavid du Colombier Extern int srvfd; 98a960ed1cSDavid du Colombier Extern char* patternfile; 993e12c5d1SDavid du Colombier 1003e12c5d1SDavid du Colombier /* File system protocol service procedures */ 1013e12c5d1SDavid du Colombier void Xattach(Fsrpc*); 1023e12c5d1SDavid du Colombier void Xauth(Fsrpc*); 1033e12c5d1SDavid du Colombier void Xclunk(Fsrpc*); 1043e12c5d1SDavid du Colombier void Xcreate(Fsrpc*); 1053e12c5d1SDavid du Colombier void Xflush(Fsrpc*); 1063e12c5d1SDavid du Colombier void Xnop(Fsrpc*); 1073e12c5d1SDavid du Colombier void Xremove(Fsrpc*); 1083e12c5d1SDavid du Colombier void Xstat(Fsrpc*); 1099a747e4fSDavid du Colombier void Xversion(Fsrpc*); 1103e12c5d1SDavid du Colombier void Xwalk(Fsrpc*); 1113e12c5d1SDavid du Colombier void Xwstat(Fsrpc*); 1123e12c5d1SDavid du Colombier void slave(Fsrpc*); 1133e12c5d1SDavid du Colombier 1143e12c5d1SDavid du Colombier void reply(Fcall*, Fcall*, char*); 1153e12c5d1SDavid du Colombier Fid *getfid(int); 1163e12c5d1SDavid du Colombier int freefid(int); 1173e12c5d1SDavid du Colombier Fid *newfid(int); 1183e12c5d1SDavid du Colombier Fsrpc *getsbuf(void); 119*61b17cc6SDavid du Colombier void putsbuf(Fsrpc*); 1203e12c5d1SDavid du Colombier void initroot(void); 1219a747e4fSDavid du Colombier void fatal(char*, ...); 1229a747e4fSDavid du Colombier char* makepath(File*, char*); 1233e12c5d1SDavid du Colombier File *file(File*, char*); 1247dd7cddfSDavid du Colombier void freefile(File*); 1253e12c5d1SDavid du Colombier void slaveopen(Fsrpc*); 1263e12c5d1SDavid du Colombier void slaveread(Fsrpc*); 1273e12c5d1SDavid du Colombier void slavewrite(Fsrpc*); 128*61b17cc6SDavid du Colombier void blockingslave(Proc*); 1293e12c5d1SDavid du Colombier void reopen(Fid *f); 1303e12c5d1SDavid du Colombier void noteproc(int, char*); 1313e12c5d1SDavid du Colombier void flushaction(void*, char*); 1323e12c5d1SDavid du Colombier void pushfcall(char*); 1337dd7cddfSDavid du Colombier Qidtab* uniqueqid(Dir*); 1347dd7cddfSDavid du Colombier void freeqid(Qidtab*); 1359a747e4fSDavid du Colombier char* estrdup(char*); 1369a747e4fSDavid du Colombier void* emallocz(uint); 1379a747e4fSDavid du Colombier int readmessage(int, char*, int); 138a960ed1cSDavid du Colombier void exclusions(void); 139a960ed1cSDavid du Colombier int excludefile(char*); 140a960ed1cSDavid du Colombier int preaddir(Fid*, uchar*, int, vlong); 141