1 #include <auth.h> 2 #include <fcall.h> 3 4 enum { 5 NFidHash = 503, 6 }; 7 8 typedef struct Con Con; 9 typedef struct DirBuf DirBuf; 10 typedef struct Excl Excl; 11 typedef struct Fid Fid; 12 typedef struct Fsys Fsys; 13 typedef struct Msg Msg; 14 15 #pragma incomplete DirBuf 16 #pragma incomplete Excl 17 #pragma incomplete Fsys 18 19 struct Msg { 20 uchar* data; 21 u32int msize; /* actual size of data */ 22 Fcall t; 23 Fcall r; 24 Con* con; 25 26 Msg* anext; /* allocation free list */ 27 28 Msg* mnext; /* all active messsages on this Con */ 29 Msg* mprev; 30 31 int state; /* */ 32 33 Msg* flush; /* flushes waiting for this Msg */ 34 35 Msg* rwnext; /* read/write queue */ 36 int nowq; /* do not place on write queue */ 37 }; 38 39 enum { 40 MsgN = 0, 41 MsgR = 1, 42 Msg9 = 2, 43 MsgW = 3, 44 MsgF = 4, 45 }; 46 47 enum { 48 ConNoneAllow = 1<<0, 49 ConNoAuthCheck = 1<<1, 50 ConNoPermCheck = 1<<2, 51 ConWstatAllow = 1<<3, 52 ConIPCheck = 1<<4, 53 }; 54 struct Con { 55 char* name; 56 uchar* data; /* max, not negotiated */ 57 int isconsole; /* immutable */ 58 int flags; /* immutable */ 59 char remote[128]; /* immutable */ 60 VtLock* lock; 61 int state; 62 int fd; 63 Msg* version; 64 u32int msize; /* negotiated with Tversion */ 65 VtRendez* rendez; 66 67 Con* anext; /* alloc */ 68 Con* cnext; /* in use */ 69 Con* cprev; 70 71 VtLock* alock; 72 int aok; /* authentication done */ 73 74 VtLock* mlock; 75 Msg* mhead; /* all Msgs on this connection */ 76 Msg* mtail; 77 VtRendez* mrendez; 78 79 VtLock* wlock; 80 Msg* whead; /* write queue */ 81 Msg* wtail; 82 VtRendez* wrendez; 83 84 VtLock* fidlock; /* */ 85 Fid* fidhash[NFidHash]; 86 Fid* fhead; 87 Fid* ftail; 88 int nfid; 89 }; 90 91 enum { 92 ConDead = 0, 93 ConNew = 1, 94 ConDown = 2, 95 ConInit = 3, 96 ConUp = 4, 97 ConMoribund = 5, 98 }; 99 100 struct Fid { 101 VtLock* lock; 102 Con* con; 103 u32int fidno; 104 int ref; /* inc/dec under Con.fidlock */ 105 int flags; 106 107 int open; 108 Fsys* fsys; 109 File* file; 110 Qid qid; 111 char* uid; 112 char* uname; 113 DirBuf* db; 114 Excl* excl; 115 116 VtLock* alock; /* Tauth/Tattach */ 117 AuthRpc* rpc; 118 char* cuname; 119 120 Fid* sort; /* sorted by uname in cmdWho */ 121 Fid* hash; /* lookup by fidno */ 122 Fid* next; /* clunk session with Tversion */ 123 Fid* prev; 124 }; 125 126 enum { /* Fid.flags and fidGet(..., flags) */ 127 FidFCreate = 0x01, 128 FidFWlock = 0x02, 129 }; 130 131 enum { /* Fid.open */ 132 FidOCreate = 0x01, 133 FidORead = 0x02, 134 FidOWrite = 0x04, 135 FidORclose = 0x08, 136 }; 137 138 /* 139 * 9p.c 140 */ 141 extern int (*rFcall[Tmax])(Msg*); 142 extern int validFileName(char*); 143 144 /* 145 * 9auth.c 146 */ 147 extern int authCheck(Fcall*, Fid*, Fsys*); 148 extern int authRead(Fid*, void*, int); 149 extern int authWrite(Fid*, void*, int); 150 151 /* 152 * 9dir.c 153 */ 154 extern void dirBufFree(DirBuf*); 155 extern int dirDe2M(DirEntry*, uchar*, int); 156 extern int dirRead(Fid*, uchar*, int, vlong); 157 158 /* 159 * 9excl.c 160 */ 161 extern int exclAlloc(Fid*); 162 extern void exclFree(Fid*); 163 extern void exclInit(void); 164 extern int exclUpdate(Fid*); 165 166 /* 167 * 9fid.c 168 */ 169 extern void fidClunk(Fid*); 170 extern void fidClunkAll(Con*); 171 extern Fid* fidGet(Con*, u32int, int); 172 extern void fidInit(void); 173 extern void fidPut(Fid*); 174 175 /* 176 * 9fsys.c 177 */ 178 extern void fsysFsRlock(Fsys*); 179 extern void fsysFsRUnlock(Fsys*); 180 extern Fs* fsysGetFs(Fsys*); 181 extern Fsys* fsysGet(char*); 182 extern char* fsysGetName(Fsys*); 183 extern File* fsysGetRoot(Fsys*, char*); 184 extern Fsys* fsysIncRef(Fsys*); 185 extern int fsysInit(void); 186 extern int fsysNoAuthCheck(Fsys*); 187 extern int fsysNoPermCheck(Fsys*); 188 extern void fsysPut(Fsys*); 189 extern int fsysWstatAllow(Fsys*); 190 191 /* 192 * 9lstn.c 193 */ 194 extern int lstnInit(void); 195 196 /* 197 * 9proc.c 198 */ 199 extern Con* conAlloc(int, char*, int); 200 extern void conInit(void); 201 extern void msgFlush(Msg*); 202 extern void msgInit(void); 203 204 /* 205 * 9srv.c 206 */ 207 extern int srvInit(void); 208 209 /* 210 * 9user.c 211 */ 212 extern int groupLeader(char*, char*); 213 extern int groupMember(char*, char*); 214 extern int groupWriteMember(char*); 215 extern char* unameByUid(char*); 216 extern char* uidByUname(char*); 217 extern int usersInit(void); 218 extern int usersFileRead(char*); 219 extern int validUserName(char*); 220 221 extern char* uidadm; 222 extern char* unamenone; 223 extern char* uidnoworld; 224 225 /* 226 * Ccli.c 227 */ 228 extern int cliAddCmd(char*, int (*)(int, char*[])); 229 extern int cliError(char*, ...); 230 extern int cliInit(void); 231 extern int cliExec(char*); 232 #pragma varargck argpos cliError 1 233 234 /* 235 * Ccmd.c 236 */ 237 extern int cmdInit(void); 238 239 /* 240 * Ccons.c 241 */ 242 extern int consPrompt(char*); 243 extern int consInit(void); 244 extern int consOpen(int, int, int); 245 extern int consTTY(void); 246 extern int consWrite(char*, int); 247 248 /* 249 * Clog.c 250 */ 251 extern int consPrint(char*, ...); 252 extern int consVPrint(char*, va_list); 253 #pragma varargck argpos consPrint 1 254 255 /* 256 * fossil.c 257 */ 258 extern int Dflag; 259