15e96a66cSDavid du Colombier #include <auth.h> 25e96a66cSDavid du Colombier #include <fcall.h> 35e96a66cSDavid du Colombier 45e96a66cSDavid du Colombier enum { 55e96a66cSDavid du Colombier NFidHash = 503, 65e96a66cSDavid du Colombier }; 75e96a66cSDavid du Colombier 85e96a66cSDavid du Colombier typedef struct Con Con; 95e96a66cSDavid du Colombier typedef struct DirBuf DirBuf; 105e96a66cSDavid du Colombier typedef struct Excl Excl; 115e96a66cSDavid du Colombier typedef struct Fid Fid; 125e96a66cSDavid du Colombier typedef struct Fsys Fsys; 135e96a66cSDavid du Colombier typedef struct Msg Msg; 145e96a66cSDavid du Colombier 1512fd1c83SDavid du Colombier #pragma incomplete DirBuf 1612fd1c83SDavid du Colombier #pragma incomplete Excl 1712fd1c83SDavid du Colombier #pragma incomplete Fsys 1812fd1c83SDavid du Colombier 195e96a66cSDavid du Colombier struct Msg { 205e96a66cSDavid du Colombier uchar* data; 215e96a66cSDavid du Colombier u32int msize; /* actual size of data */ 225e96a66cSDavid du Colombier Fcall t; 235e96a66cSDavid du Colombier Fcall r; 245e96a66cSDavid du Colombier Con* con; 255e96a66cSDavid du Colombier 267f1bc48aSDavid du Colombier Msg* anext; /* allocation free list */ 2734e04225SDavid du Colombier 287f1bc48aSDavid du Colombier Msg* mnext; /* all active messsages on this Con */ 2934e04225SDavid du Colombier Msg* mprev; 3034e04225SDavid du Colombier 317f1bc48aSDavid du Colombier int state; /* */ 3234e04225SDavid du Colombier 337f1bc48aSDavid du Colombier Msg* flush; /* flushes waiting for this Msg */ 3434e04225SDavid du Colombier 357f1bc48aSDavid du Colombier Msg* rwnext; /* read/write queue */ 367f1bc48aSDavid du Colombier int nowq; /* do not place on write queue */ 3734e04225SDavid du Colombier }; 3834e04225SDavid du Colombier 3934e04225SDavid du Colombier enum { 4034e04225SDavid du Colombier MsgN = 0, 4134e04225SDavid du Colombier MsgR = 1, 4234e04225SDavid du Colombier Msg9 = 2, 4334e04225SDavid du Colombier MsgW = 3, 4434e04225SDavid du Colombier MsgF = 4, 455e96a66cSDavid du Colombier }; 465e96a66cSDavid du Colombier 472cca75a1SDavid du Colombier enum { 482cca75a1SDavid du Colombier ConNoneAllow = 1<<0, 492cca75a1SDavid du Colombier ConNoAuthCheck = 1<<1, 502cca75a1SDavid du Colombier ConNoPermCheck = 1<<2, 512cca75a1SDavid du Colombier ConWstatAllow = 1<<3, 522cca75a1SDavid du Colombier ConIPCheck = 1<<4, 532cca75a1SDavid du Colombier }; 545e96a66cSDavid du Colombier struct Con { 555e96a66cSDavid du Colombier char* name; 565e96a66cSDavid du Colombier uchar* data; /* max, not negotiated */ 5734e04225SDavid du Colombier int isconsole; /* immutable */ 582cca75a1SDavid du Colombier int flags; /* immutable */ 592cca75a1SDavid du Colombier char remote[128]; /* immutable */ 6034e04225SDavid du Colombier VtLock* lock; 6134e04225SDavid du Colombier int state; 6234e04225SDavid du Colombier int fd; 6334e04225SDavid du Colombier Msg* version; 6434e04225SDavid du Colombier u32int msize; /* negotiated with Tversion */ 6534e04225SDavid du Colombier VtRendez* rendez; 6634e04225SDavid du Colombier 6734e04225SDavid du Colombier Con* anext; /* alloc */ 6834e04225SDavid du Colombier Con* cnext; /* in use */ 6934e04225SDavid du Colombier Con* cprev; 7034e04225SDavid du Colombier 7134e04225SDavid du Colombier VtLock* alock; 7234e04225SDavid du Colombier int aok; /* authentication done */ 7334e04225SDavid du Colombier 7434e04225SDavid du Colombier VtLock* mlock; 7534e04225SDavid du Colombier Msg* mhead; /* all Msgs on this connection */ 765e96a66cSDavid du Colombier Msg* mtail; 7734e04225SDavid du Colombier VtRendez* mrendez; 7834e04225SDavid du Colombier 7934e04225SDavid du Colombier VtLock* wlock; 8034e04225SDavid du Colombier Msg* whead; /* write queue */ 8134e04225SDavid du Colombier Msg* wtail; 8234e04225SDavid du Colombier VtRendez* wrendez; 835e96a66cSDavid du Colombier 845e96a66cSDavid du Colombier VtLock* fidlock; /* */ 855e96a66cSDavid du Colombier Fid* fidhash[NFidHash]; 865e96a66cSDavid du Colombier Fid* fhead; 875e96a66cSDavid du Colombier Fid* ftail; 885e96a66cSDavid du Colombier int nfid; 895e96a66cSDavid du Colombier }; 905e96a66cSDavid du Colombier 915e96a66cSDavid du Colombier enum { 9234e04225SDavid du Colombier ConDead = 0, 9334e04225SDavid du Colombier ConNew = 1, 9434e04225SDavid du Colombier ConDown = 2, 9534e04225SDavid du Colombier ConInit = 3, 9634e04225SDavid du Colombier ConUp = 4, 9734e04225SDavid du Colombier ConMoribund = 5, 985e96a66cSDavid du Colombier }; 995e96a66cSDavid du Colombier 1005e96a66cSDavid du Colombier struct Fid { 1015e96a66cSDavid du Colombier VtLock* lock; 1025e96a66cSDavid du Colombier Con* con; 1035e96a66cSDavid du Colombier u32int fidno; 1045e96a66cSDavid du Colombier int ref; /* inc/dec under Con.fidlock */ 1055e96a66cSDavid du Colombier int flags; 1065e96a66cSDavid du Colombier 1075e96a66cSDavid du Colombier int open; 10834e04225SDavid du Colombier Fsys* fsys; 1095e96a66cSDavid du Colombier File* file; 1105e96a66cSDavid du Colombier Qid qid; 1115e96a66cSDavid du Colombier char* uid; 1125e96a66cSDavid du Colombier char* uname; 1135e96a66cSDavid du Colombier DirBuf* db; 1145e96a66cSDavid du Colombier Excl* excl; 1155e96a66cSDavid du Colombier 1165e96a66cSDavid du Colombier VtLock* alock; /* Tauth/Tattach */ 1175e96a66cSDavid du Colombier AuthRpc* rpc; 1185e96a66cSDavid du Colombier char* cuname; 1195e96a66cSDavid du Colombier 12081cf8742SDavid du Colombier Fid* sort; /* sorted by uname in cmdWho */ 1215e96a66cSDavid du Colombier Fid* hash; /* lookup by fidno */ 1225e96a66cSDavid du Colombier Fid* next; /* clunk session with Tversion */ 1235e96a66cSDavid du Colombier Fid* prev; 1245e96a66cSDavid du Colombier }; 1255e96a66cSDavid du Colombier 1265e96a66cSDavid du Colombier enum { /* Fid.flags and fidGet(..., flags) */ 1275e96a66cSDavid du Colombier FidFCreate = 0x01, 1285e96a66cSDavid du Colombier FidFWlock = 0x02, 1295e96a66cSDavid du Colombier }; 1305e96a66cSDavid du Colombier 1315e96a66cSDavid du Colombier enum { /* Fid.open */ 1325e96a66cSDavid du Colombier FidOCreate = 0x01, 1335e96a66cSDavid du Colombier FidORead = 0x02, 1345e96a66cSDavid du Colombier FidOWrite = 0x04, 1355e96a66cSDavid du Colombier FidORclose = 0x08, 1365e96a66cSDavid du Colombier }; 1375e96a66cSDavid du Colombier 1385e96a66cSDavid du Colombier /* 1395e96a66cSDavid du Colombier * 9p.c 1405e96a66cSDavid du Colombier */ 1415e96a66cSDavid du Colombier extern int (*rFcall[Tmax])(Msg*); 1425e96a66cSDavid du Colombier extern int validFileName(char*); 1435e96a66cSDavid du Colombier 1445e96a66cSDavid du Colombier /* 1455e96a66cSDavid du Colombier * 9auth.c 1465e96a66cSDavid du Colombier */ 1475e96a66cSDavid du Colombier extern int authCheck(Fcall*, Fid*, Fsys*); 1485e96a66cSDavid du Colombier extern int authRead(Fid*, void*, int); 1495e96a66cSDavid du Colombier extern int authWrite(Fid*, void*, int); 1505e96a66cSDavid du Colombier 1515e96a66cSDavid du Colombier /* 1525e96a66cSDavid du Colombier * 9dir.c 1535e96a66cSDavid du Colombier */ 1545e96a66cSDavid du Colombier extern void dirBufFree(DirBuf*); 1555e96a66cSDavid du Colombier extern int dirDe2M(DirEntry*, uchar*, int); 1565e96a66cSDavid du Colombier extern int dirRead(Fid*, uchar*, int, vlong); 1575e96a66cSDavid du Colombier 1585e96a66cSDavid du Colombier /* 1595e96a66cSDavid du Colombier * 9excl.c 1605e96a66cSDavid du Colombier */ 1615e96a66cSDavid du Colombier extern int exclAlloc(Fid*); 1625e96a66cSDavid du Colombier extern void exclFree(Fid*); 1635e96a66cSDavid du Colombier extern void exclInit(void); 1645e96a66cSDavid du Colombier extern int exclUpdate(Fid*); 1655e96a66cSDavid du Colombier 1665e96a66cSDavid du Colombier /* 1675e96a66cSDavid du Colombier * 9fid.c 1685e96a66cSDavid du Colombier */ 1695e96a66cSDavid du Colombier extern void fidClunk(Fid*); 17034e04225SDavid du Colombier extern void fidClunkAll(Con*); 1715e96a66cSDavid du Colombier extern Fid* fidGet(Con*, u32int, int); 1725e96a66cSDavid du Colombier extern void fidInit(void); 1735e96a66cSDavid du Colombier extern void fidPut(Fid*); 1745e96a66cSDavid du Colombier 1755e96a66cSDavid du Colombier /* 1765e96a66cSDavid du Colombier * 9fsys.c 1775e96a66cSDavid du Colombier */ 1785e96a66cSDavid du Colombier extern void fsysFsRlock(Fsys*); 1795e96a66cSDavid du Colombier extern void fsysFsRUnlock(Fsys*); 18034e04225SDavid du Colombier extern Fs* fsysGetFs(Fsys*); 18134e04225SDavid du Colombier extern Fsys* fsysGet(char*); 18234e04225SDavid du Colombier extern char* fsysGetName(Fsys*); 1835e96a66cSDavid du Colombier extern File* fsysGetRoot(Fsys*, char*); 1845e96a66cSDavid du Colombier extern Fsys* fsysIncRef(Fsys*); 1855e96a66cSDavid du Colombier extern int fsysInit(void); 1865e96a66cSDavid du Colombier extern int fsysNoAuthCheck(Fsys*); 1875e96a66cSDavid du Colombier extern int fsysNoPermCheck(Fsys*); 1885e96a66cSDavid du Colombier extern void fsysPut(Fsys*); 1895e96a66cSDavid du Colombier extern int fsysWstatAllow(Fsys*); 1905e96a66cSDavid du Colombier 1915e96a66cSDavid du Colombier /* 1925e96a66cSDavid du Colombier * 9lstn.c 1935e96a66cSDavid du Colombier */ 1945e96a66cSDavid du Colombier extern int lstnInit(void); 1955e96a66cSDavid du Colombier 1965e96a66cSDavid du Colombier /* 1975e96a66cSDavid du Colombier * 9proc.c 1985e96a66cSDavid du Colombier */ 1992cca75a1SDavid du Colombier extern Con* conAlloc(int, char*, int); 20034e04225SDavid du Colombier extern void conInit(void); 20134e04225SDavid du Colombier extern void msgFlush(Msg*); 20234e04225SDavid du Colombier extern void msgInit(void); 2035e96a66cSDavid du Colombier 2045e96a66cSDavid du Colombier /* 2055e96a66cSDavid du Colombier * 9srv.c 2065e96a66cSDavid du Colombier */ 2075e96a66cSDavid du Colombier extern int srvInit(void); 2085e96a66cSDavid du Colombier 2095e96a66cSDavid du Colombier /* 2105e96a66cSDavid du Colombier * 9user.c 2115e96a66cSDavid du Colombier */ 2125e96a66cSDavid du Colombier extern int groupLeader(char*, char*); 2135e96a66cSDavid du Colombier extern int groupMember(char*, char*); 2145e96a66cSDavid du Colombier extern int groupWriteMember(char*); 2155e96a66cSDavid du Colombier extern char* unameByUid(char*); 2165e96a66cSDavid du Colombier extern char* uidByUname(char*); 2175e96a66cSDavid du Colombier extern int usersInit(void); 21881cf8742SDavid du Colombier extern int usersFileRead(char*); 2195e96a66cSDavid du Colombier extern int validUserName(char*); 2205e96a66cSDavid du Colombier 2215e96a66cSDavid du Colombier extern char* uidadm; 2225e96a66cSDavid du Colombier extern char* unamenone; 2235e96a66cSDavid du Colombier extern char* uidnoworld; 2245e96a66cSDavid du Colombier 2255e96a66cSDavid du Colombier /* 2265e96a66cSDavid du Colombier * Ccli.c 2275e96a66cSDavid du Colombier */ 2285e96a66cSDavid du Colombier extern int cliAddCmd(char*, int (*)(int, char*[])); 2295e96a66cSDavid du Colombier extern int cliError(char*, ...); 2305e96a66cSDavid du Colombier extern int cliInit(void); 2315e96a66cSDavid du Colombier extern int cliExec(char*); 232*0c6300e7SDavid du Colombier #pragma varargck argpos cliError 1 2335e96a66cSDavid du Colombier 2345e96a66cSDavid du Colombier /* 2355e96a66cSDavid du Colombier * Ccmd.c 2365e96a66cSDavid du Colombier */ 2375e96a66cSDavid du Colombier extern int cmdInit(void); 2385e96a66cSDavid du Colombier 2395e96a66cSDavid du Colombier /* 2405e96a66cSDavid du Colombier * Ccons.c 2415e96a66cSDavid du Colombier */ 2425e96a66cSDavid du Colombier extern int consPrompt(char*); 2435e96a66cSDavid du Colombier extern int consInit(void); 2445e96a66cSDavid du Colombier extern int consOpen(int, int, int); 2455e96a66cSDavid du Colombier extern int consTTY(void); 2465e96a66cSDavid du Colombier extern int consWrite(char*, int); 2475e96a66cSDavid du Colombier 2485e96a66cSDavid du Colombier /* 2495e96a66cSDavid du Colombier * Clog.c 2505e96a66cSDavid du Colombier */ 2515e96a66cSDavid du Colombier extern int consPrint(char*, ...); 2525e96a66cSDavid du Colombier extern int consVPrint(char*, va_list); 253*0c6300e7SDavid du Colombier #pragma varargck argpos consPrint 1 2545e96a66cSDavid du Colombier 2555e96a66cSDavid du Colombier /* 2565e96a66cSDavid du Colombier * fossil.c 2575e96a66cSDavid du Colombier */ 2585e96a66cSDavid du Colombier extern int Dflag; 259