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