17dd7cddfSDavid du Colombier #pragma src "/sys/src/lib9p" 27dd7cddfSDavid du Colombier #pragma lib "lib9p.a" 37dd7cddfSDavid du Colombier 49a747e4fSDavid du Colombier /* 59a747e4fSDavid du Colombier * Maps from ulongs to void*s. 69a747e4fSDavid du Colombier */ 79a747e4fSDavid du Colombier typedef struct Intmap Intmap; 89a747e4fSDavid du Colombier 912fd1c83SDavid du Colombier #pragma incomplete Intmap 1012fd1c83SDavid du Colombier 119a747e4fSDavid du Colombier Intmap* allocmap(void (*inc)(void*)); 129a747e4fSDavid du Colombier void freemap(Intmap*, void (*destroy)(void*)); 139a747e4fSDavid du Colombier void* lookupkey(Intmap*, ulong); 149a747e4fSDavid du Colombier void* insertkey(Intmap*, ulong, void*); 159a747e4fSDavid du Colombier int caninsertkey(Intmap*, ulong, void*); 169a747e4fSDavid du Colombier void* deletekey(Intmap*, ulong); 179a747e4fSDavid du Colombier 189a747e4fSDavid du Colombier /* 199a747e4fSDavid du Colombier * Fid and Request structures. 209a747e4fSDavid du Colombier */ 217dd7cddfSDavid du Colombier typedef struct Fid Fid; 229a747e4fSDavid du Colombier typedef struct Req Req; 237dd7cddfSDavid du Colombier typedef struct Fidpool Fidpool; 249a747e4fSDavid du Colombier typedef struct Reqpool Reqpool; 257dd7cddfSDavid du Colombier typedef struct File File; 267dd7cddfSDavid du Colombier typedef struct Filelist Filelist; 277dd7cddfSDavid du Colombier typedef struct Tree Tree; 289a747e4fSDavid du Colombier typedef struct Readdir Readdir; 299a747e4fSDavid du Colombier typedef struct Srv Srv; 307dd7cddfSDavid du Colombier 3112fd1c83SDavid du Colombier #pragma incomplete Filelist 3212fd1c83SDavid du Colombier #pragma incomplete Readdir 3312fd1c83SDavid du Colombier 347dd7cddfSDavid du Colombier struct Fid 357dd7cddfSDavid du Colombier { 367dd7cddfSDavid du Colombier ulong fid; 377dd7cddfSDavid du Colombier char omode; /* -1 = not open */ 387dd7cddfSDavid du Colombier File* file; 399a747e4fSDavid du Colombier char* uid; 407dd7cddfSDavid du Colombier Qid qid; 417dd7cddfSDavid du Colombier void* aux; 427dd7cddfSDavid du Colombier 437dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */ 449a747e4fSDavid du Colombier Readdir* rdir; 457dd7cddfSDavid du Colombier Ref ref; 467dd7cddfSDavid du Colombier Fidpool* pool; 479a747e4fSDavid du Colombier vlong diroffset; 489a747e4fSDavid du Colombier long dirindex; 497dd7cddfSDavid du Colombier }; 507dd7cddfSDavid du Colombier 517dd7cddfSDavid du Colombier struct Req 527dd7cddfSDavid du Colombier { 537dd7cddfSDavid du Colombier ulong tag; 547dd7cddfSDavid du Colombier void* aux; 559a747e4fSDavid du Colombier Fcall ifcall; 567dd7cddfSDavid du Colombier Fcall ofcall; 579a747e4fSDavid du Colombier Dir d; 589a747e4fSDavid du Colombier Req* oldreq; 599a747e4fSDavid du Colombier Fid* fid; 609a747e4fSDavid du Colombier Fid* afid; 619a747e4fSDavid du Colombier Fid* newfid; 629a747e4fSDavid du Colombier Srv* srv; 637dd7cddfSDavid du Colombier 647dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */ 657fd46167SDavid du Colombier QLock lk; 667dd7cddfSDavid du Colombier Ref ref; 677dd7cddfSDavid du Colombier Reqpool* pool; 689a747e4fSDavid du Colombier uchar* buf; 697dd7cddfSDavid du Colombier uchar type; 707dd7cddfSDavid du Colombier uchar responded; 717dd7cddfSDavid du Colombier char* error; 7259cc4ca5SDavid du Colombier void* rbuf; 737fd46167SDavid du Colombier Req** flush; 747fd46167SDavid du Colombier int nflush; 757dd7cddfSDavid du Colombier }; 767dd7cddfSDavid du Colombier 779a747e4fSDavid du Colombier /* 789a747e4fSDavid du Colombier * Pools to maintain Fid <-> fid and Req <-> tag maps. 799a747e4fSDavid du Colombier */ 807dd7cddfSDavid du Colombier 819a747e4fSDavid du Colombier struct Fidpool { 829a747e4fSDavid du Colombier Intmap *map; 839a747e4fSDavid du Colombier void (*destroy)(Fid*); 849a747e4fSDavid du Colombier Srv *srv; 857dd7cddfSDavid du Colombier }; 867dd7cddfSDavid du Colombier 879a747e4fSDavid du Colombier struct Reqpool { 889a747e4fSDavid du Colombier Intmap *map; 899a747e4fSDavid du Colombier void (*destroy)(Req*); 909a747e4fSDavid du Colombier Srv *srv; 919a747e4fSDavid du Colombier }; 929a747e4fSDavid du Colombier 939a747e4fSDavid du Colombier Fidpool* allocfidpool(void (*destroy)(Fid*)); 949a747e4fSDavid du Colombier void freefidpool(Fidpool*); 959a747e4fSDavid du Colombier Fid* allocfid(Fidpool*, ulong); 969a747e4fSDavid du Colombier Fid* lookupfid(Fidpool*, ulong); 979a747e4fSDavid du Colombier void closefid(Fid*); 989a747e4fSDavid du Colombier Fid* removefid(Fidpool*, ulong); 999a747e4fSDavid du Colombier 1009a747e4fSDavid du Colombier Reqpool* allocreqpool(void (*destroy)(Req*)); 1019a747e4fSDavid du Colombier void freereqpool(Reqpool*); 1029a747e4fSDavid du Colombier Req* allocreq(Reqpool*, ulong); 1039a747e4fSDavid du Colombier Req* lookupreq(Reqpool*, ulong); 1049a747e4fSDavid du Colombier void closereq(Req*); 1059a747e4fSDavid du Colombier Req* removereq(Reqpool*, ulong); 1069a747e4fSDavid du Colombier 1079a747e4fSDavid du Colombier typedef int Dirgen(int, Dir*, void*); 1089a747e4fSDavid du Colombier void dirread9p(Req*, Dirgen*, void*); 1099a747e4fSDavid du Colombier 1109a747e4fSDavid du Colombier /* 1119a747e4fSDavid du Colombier * File trees. 1129a747e4fSDavid du Colombier */ 1137dd7cddfSDavid du Colombier struct File { 1149a747e4fSDavid du Colombier Ref; 1157dd7cddfSDavid du Colombier Dir; 1167dd7cddfSDavid du Colombier File *parent; 1177dd7cddfSDavid du Colombier void *aux; 1187dd7cddfSDavid du Colombier 1197dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */ 1209a747e4fSDavid du Colombier RWLock; 1217dd7cddfSDavid du Colombier Filelist *filelist; 1227dd7cddfSDavid du Colombier Tree *tree; 1239a747e4fSDavid du Colombier int nchild; 1249a747e4fSDavid du Colombier int allocd; 1259d47229fSDavid du Colombier int nxchild; 1269d47229fSDavid du Colombier Ref readers; 1277dd7cddfSDavid du Colombier }; 1287dd7cddfSDavid du Colombier 1297dd7cddfSDavid du Colombier struct Tree { 1307dd7cddfSDavid du Colombier File *root; 1319a747e4fSDavid du Colombier void (*destroy)(File *file); 1327dd7cddfSDavid du Colombier 1337dd7cddfSDavid du Colombier /* below is implementation-specific; don't use */ 1349a747e4fSDavid du Colombier Lock genlock; 1357dd7cddfSDavid du Colombier ulong qidgen; 1367dd7cddfSDavid du Colombier ulong dirqidgen; 1377dd7cddfSDavid du Colombier }; 1387dd7cddfSDavid du Colombier 1399a747e4fSDavid du Colombier Tree* alloctree(char*, char*, ulong, void(*destroy)(File*)); 1409a747e4fSDavid du Colombier void freetree(Tree*); 1419a747e4fSDavid du Colombier File* createfile(File*, char*, char*, ulong, void*); 1429a747e4fSDavid du Colombier int removefile(File*); 1439a747e4fSDavid du Colombier void closefile(File*); 1449a747e4fSDavid du Colombier File* walkfile(File*, char*); 1459a747e4fSDavid du Colombier Readdir* opendirfile(File*); 1469a747e4fSDavid du Colombier long readdirfile(Readdir*, uchar*, long); 1479a747e4fSDavid du Colombier void closedirfile(Readdir*); 1487dd7cddfSDavid du Colombier 1499a747e4fSDavid du Colombier /* 1503ff48bf5SDavid du Colombier * Kernel-style command parser 1513ff48bf5SDavid du Colombier */ 1523ff48bf5SDavid du Colombier typedef struct Cmdbuf Cmdbuf; 1533ff48bf5SDavid du Colombier typedef struct Cmdtab Cmdtab; 1543ff48bf5SDavid du Colombier Cmdbuf* parsecmd(char *a, int n); 1553ff48bf5SDavid du Colombier void respondcmderror(Req*, Cmdbuf*, char*, ...); 1563ff48bf5SDavid du Colombier Cmdtab* lookupcmd(Cmdbuf*, Cmdtab*, int); 1573ff48bf5SDavid du Colombier #pragma varargck argpos respondcmderr 3 1583ff48bf5SDavid du Colombier struct Cmdbuf 1593ff48bf5SDavid du Colombier { 1603ff48bf5SDavid du Colombier char *buf; 1613ff48bf5SDavid du Colombier char **f; 1623ff48bf5SDavid du Colombier int nf; 1633ff48bf5SDavid du Colombier }; 1643ff48bf5SDavid du Colombier 1653ff48bf5SDavid du Colombier struct Cmdtab 1663ff48bf5SDavid du Colombier { 1673ff48bf5SDavid du Colombier int index; /* used by client to switch on result */ 1683ff48bf5SDavid du Colombier char *cmd; /* command name */ 1693ff48bf5SDavid du Colombier int narg; /* expected #args; 0 ==> variadic */ 1703ff48bf5SDavid du Colombier }; 1713ff48bf5SDavid du Colombier 1723ff48bf5SDavid du Colombier /* 1739a747e4fSDavid du Colombier * File service loop. 1749a747e4fSDavid du Colombier */ 1759a747e4fSDavid du Colombier struct Srv { 1769a747e4fSDavid du Colombier Tree* tree; 1779a747e4fSDavid du Colombier void (*destroyfid)(Fid*); 1789a747e4fSDavid du Colombier void (*destroyreq)(Req*); 1799a747e4fSDavid du Colombier void (*end)(Srv*); 1809a747e4fSDavid du Colombier void* aux; 1817dd7cddfSDavid du Colombier 1829a747e4fSDavid du Colombier void (*attach)(Req*); 1839a747e4fSDavid du Colombier void (*auth)(Req*); 1849a747e4fSDavid du Colombier void (*open)(Req*); 1859a747e4fSDavid du Colombier void (*create)(Req*); 1869a747e4fSDavid du Colombier void (*read)(Req*); 1879a747e4fSDavid du Colombier void (*write)(Req*); 1889a747e4fSDavid du Colombier void (*remove)(Req*); 1899a747e4fSDavid du Colombier void (*flush)(Req*); 1909a747e4fSDavid du Colombier void (*stat)(Req*); 1919a747e4fSDavid du Colombier void (*wstat)(Req*); 1929a747e4fSDavid du Colombier void (*walk)(Req*); 1939a747e4fSDavid du Colombier char* (*clone)(Fid*, Fid*); 1949a747e4fSDavid du Colombier char* (*walk1)(Fid*, char*, Qid*); 1957dd7cddfSDavid du Colombier 1969a747e4fSDavid du Colombier int infd; 1979a747e4fSDavid du Colombier int outfd; 1989a747e4fSDavid du Colombier int nopipe; 1999a747e4fSDavid du Colombier int srvfd; 2002ebbfa15SDavid du Colombier int leavefdsopen; /* magic for acme win */ 20122a127bbSDavid du Colombier char* keyspec; 2027dd7cddfSDavid du Colombier 2039a747e4fSDavid du Colombier /* below is implementation-specific; don't use */ 2049a747e4fSDavid du Colombier Fidpool* fpool; 2059a747e4fSDavid du Colombier Reqpool* rpool; 2069a747e4fSDavid du Colombier uint msize; 2079a747e4fSDavid du Colombier 2089a747e4fSDavid du Colombier uchar* rbuf; 2099a747e4fSDavid du Colombier QLock rlock; 2109a747e4fSDavid du Colombier uchar* wbuf; 2119a747e4fSDavid du Colombier QLock wlock; 21222a127bbSDavid du Colombier 21322a127bbSDavid du Colombier char* addr; 2149a747e4fSDavid du Colombier }; 2159a747e4fSDavid du Colombier 2169a747e4fSDavid du Colombier void srv(Srv*); 2177dd7cddfSDavid du Colombier void postmountsrv(Srv*, char*, char*, int); 21822a127bbSDavid du Colombier void _postmountsrv(Srv*, char*, char*, int); 21922a127bbSDavid du Colombier void listensrv(Srv*, char*); 22022a127bbSDavid du Colombier void _listensrv(Srv*, char*); 2219a747e4fSDavid du Colombier int postfd(char*, int); 2229a747e4fSDavid du Colombier int chatty9p; 2237dd7cddfSDavid du Colombier void respond(Req*, char*); 22422a127bbSDavid du Colombier void responderror(Req*); 22580ee5cbfSDavid du Colombier void threadpostmountsrv(Srv*, char*, char*, int); 226*431b537fSDavid du Colombier void threadlistensrv(Srv *s, char *addr); 22759cc4ca5SDavid du Colombier 2289a747e4fSDavid du Colombier /* 2299a747e4fSDavid du Colombier * Helper. Assumes user is same as group. 2309a747e4fSDavid du Colombier */ 2317dd7cddfSDavid du Colombier int hasperm(File*, char*, int); 2327dd7cddfSDavid du Colombier 2339a747e4fSDavid du Colombier void* emalloc9p(ulong); 2349a747e4fSDavid du Colombier void* erealloc9p(void*, ulong); 2359a747e4fSDavid du Colombier char* estrdup9p(char*); 2367dd7cddfSDavid du Colombier 2377dd7cddfSDavid du Colombier enum { 2387dd7cddfSDavid du Colombier OMASK = 3 2397dd7cddfSDavid du Colombier }; 24059cc4ca5SDavid du Colombier 2419a747e4fSDavid du Colombier void readstr(Req*, char*); 2429a747e4fSDavid du Colombier void readbuf(Req*, void*, long); 24322a127bbSDavid du Colombier void walkandclone(Req*, char*(*walk1)(Fid*,char*,void*), 24422a127bbSDavid du Colombier char*(*clone)(Fid*,Fid*,void*), void*); 24522a127bbSDavid du Colombier 24622a127bbSDavid du Colombier void auth9p(Req*); 24722a127bbSDavid du Colombier void authread(Req*); 24822a127bbSDavid du Colombier void authwrite(Req*); 24922a127bbSDavid du Colombier void authdestroy(Fid*); 25022a127bbSDavid du Colombier int authattach(Req*); 25122a127bbSDavid du Colombier 25222a127bbSDavid du Colombier extern void (*_forker)(void (*)(void*), void*, int); 2537fd46167SDavid du Colombier 254