13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * exportfs.h - definitions for exporting file server 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier #define DEBUG if(!dbg);else fprint 63e12c5d1SDavid du Colombier #define fidhash(s) fhash[s%FHASHSIZE] 73e12c5d1SDavid du Colombier 83e12c5d1SDavid du Colombier typedef struct Fsrpc Fsrpc; 93e12c5d1SDavid du Colombier typedef struct Fid Fid; 103e12c5d1SDavid du Colombier typedef struct File File; 113e12c5d1SDavid du Colombier typedef struct Proc Proc; 123e12c5d1SDavid du Colombier 133e12c5d1SDavid du Colombier struct Fsrpc 143e12c5d1SDavid du Colombier { 153e12c5d1SDavid du Colombier int busy; /* Work buffer has pending rpc to service */ 163e12c5d1SDavid du Colombier int pid; /* Pid of slave process executing the rpc */ 173e12c5d1SDavid du Colombier int canint; /* Interrupt gate */ 183e12c5d1SDavid du Colombier int flushtag; /* Tag on which to reply to flush */ 193e12c5d1SDavid du Colombier Fcall work; /* Plan 9 incoming Fcall */ 203e12c5d1SDavid du Colombier char buf[MAXFDATA+MAXMSG]; /* 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 int offset; /* current file offset */ 273e12c5d1SDavid du Colombier File *f; /* File attached to this fid */ 283e12c5d1SDavid du Colombier int mode; 293e12c5d1SDavid du Colombier int nr; /* fid number */ 30*219b2ee8SDavid du Colombier Fsrpc *mpend; /* Split transaction mount */ 31*219b2ee8SDavid du Colombier int mid; /* Mount id */ 323e12c5d1SDavid du Colombier Fid *next; /* hash link */ 333e12c5d1SDavid du Colombier }; 343e12c5d1SDavid du Colombier 353e12c5d1SDavid du Colombier struct File 363e12c5d1SDavid du Colombier { 373e12c5d1SDavid du Colombier char name[NAMELEN]; 383e12c5d1SDavid du Colombier Qid qid; 393e12c5d1SDavid du Colombier File *parent; 403e12c5d1SDavid du Colombier File *child; 413e12c5d1SDavid du Colombier File *childlist; 423e12c5d1SDavid du Colombier }; 433e12c5d1SDavid du Colombier 443e12c5d1SDavid du Colombier struct Proc 453e12c5d1SDavid du Colombier { 463e12c5d1SDavid du Colombier int pid; 473e12c5d1SDavid du Colombier int busy; 483e12c5d1SDavid du Colombier Proc *next; 493e12c5d1SDavid du Colombier }; 503e12c5d1SDavid du Colombier 513e12c5d1SDavid du Colombier enum 523e12c5d1SDavid du Colombier { 53*219b2ee8SDavid du Colombier MAXPROC = 16, 54*219b2ee8SDavid du Colombier DIRCHUNK = (50*DIRLEN), 55*219b2ee8SDavid du Colombier FHASHSIZE = 64, 563e12c5d1SDavid du Colombier Nr_workbufs = 16, 573e12c5d1SDavid du Colombier Fidchunk = 1000, 58*219b2ee8SDavid du Colombier Npsmpt = 32, 593e12c5d1SDavid du Colombier }; 603e12c5d1SDavid du Colombier 613e12c5d1SDavid du Colombier enum 623e12c5d1SDavid du Colombier { 633e12c5d1SDavid du Colombier Ebadfid, 643e12c5d1SDavid du Colombier Enotdir, 653e12c5d1SDavid du Colombier Edupfid, 663e12c5d1SDavid du Colombier Eopen, 673e12c5d1SDavid du Colombier Exmnt, 683e12c5d1SDavid du Colombier Enoauth, 69*219b2ee8SDavid du Colombier Emip, 70*219b2ee8SDavid du Colombier Enopsmt, 713e12c5d1SDavid du Colombier }; 723e12c5d1SDavid du Colombier 733e12c5d1SDavid du Colombier Extern Fsrpc *Workq; 743e12c5d1SDavid du Colombier Extern int dbg; 753e12c5d1SDavid du Colombier Extern File *root; 76*219b2ee8SDavid du Colombier Extern File *psmpt; 773e12c5d1SDavid du Colombier Extern Fid **fhash; 783e12c5d1SDavid du Colombier Extern Fid *fidfree; 793e12c5d1SDavid du Colombier Extern int qid; 803e12c5d1SDavid du Colombier Extern Proc *Proclist; 81*219b2ee8SDavid du Colombier Extern char psmap[Npsmpt]; 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier /* File system protocol service procedures */ 843e12c5d1SDavid du Colombier void Xattach(Fsrpc*); 853e12c5d1SDavid du Colombier void Xauth(Fsrpc*); 863e12c5d1SDavid du Colombier void Xclone(Fsrpc*); 873e12c5d1SDavid du Colombier void Xclunk(Fsrpc*); 883e12c5d1SDavid du Colombier void Xclwalk(Fsrpc*); 893e12c5d1SDavid du Colombier void Xcreate(Fsrpc*); 903e12c5d1SDavid du Colombier void Xflush(Fsrpc*); 913e12c5d1SDavid du Colombier void Xnop(Fsrpc*); 923e12c5d1SDavid du Colombier void Xremove(Fsrpc*); 933e12c5d1SDavid du Colombier void Xsession(Fsrpc*); 943e12c5d1SDavid du Colombier void Xstat(Fsrpc*); 953e12c5d1SDavid du Colombier void Xwalk(Fsrpc*); 963e12c5d1SDavid du Colombier void Xwstat(Fsrpc*); 973e12c5d1SDavid du Colombier void slave(Fsrpc*); 983e12c5d1SDavid du Colombier 993e12c5d1SDavid du Colombier void reply(Fcall*, Fcall*, char*); 1003e12c5d1SDavid du Colombier Fid *getfid(int); 1013e12c5d1SDavid du Colombier int freefid(int); 1023e12c5d1SDavid du Colombier Fid *newfid(int); 1033e12c5d1SDavid du Colombier Fsrpc *getsbuf(void); 1043e12c5d1SDavid du Colombier void initroot(void); 1053e12c5d1SDavid du Colombier void fatal(char*); 1063e12c5d1SDavid du Colombier void makepath(char*, File*, char*); 1073e12c5d1SDavid du Colombier File *file(File*, char*); 1083e12c5d1SDavid du Colombier void slaveopen(Fsrpc*); 1093e12c5d1SDavid du Colombier void slaveread(Fsrpc*); 1103e12c5d1SDavid du Colombier void slavewrite(Fsrpc*); 1113e12c5d1SDavid du Colombier void blockingslave(void); 1123e12c5d1SDavid du Colombier void reopen(Fid *f); 1133e12c5d1SDavid du Colombier void fileseek(Fid*, ulong); 1143e12c5d1SDavid du Colombier void noteproc(int, char*); 1153e12c5d1SDavid du Colombier void flushaction(void*, char*); 1163e12c5d1SDavid du Colombier void pushfcall(char*); 117