exportfs.h 2.7 KB

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