blob: b6e959b160d97d01803fea962e3772385a81f839 [file] [log] [blame]
rsc2277c5d2004-03-21 04:33:13 +00001#ifndef __9P_H__
2#define __9P_H__ 1
3
4#ifdef __cplusplus
5extern "C" {
6#endif
7
8/*
9#pragma src "/sys/src/lib9p"
10#pragma lib "lib9p.a"
11*/
rsced670c42005-02-08 21:04:03 +000012AUTOLIB(9p)
rsc2277c5d2004-03-21 04:33:13 +000013
14/*
15 * Maps from ulongs to void*s.
16 */
17typedef struct Intmap Intmap;
18
19Intmap* allocmap(void (*inc)(void*));
20void freemap(Intmap*, void (*destroy)(void*));
21void* lookupkey(Intmap*, ulong);
22void* insertkey(Intmap*, ulong, void*);
23int caninsertkey(Intmap*, ulong, void*);
24void* deletekey(Intmap*, ulong);
25
26/*
27 * Fid and Request structures.
28 */
29typedef struct Fid Fid;
30typedef struct Req Req;
31typedef struct Fidpool Fidpool;
32typedef struct Reqpool Reqpool;
33typedef struct File File;
34typedef struct Filelist Filelist;
35typedef struct Tree Tree;
36typedef struct Readdir Readdir;
37typedef struct Srv Srv;
38
39struct Fid
40{
41 ulong fid;
rsc1c171e32005-07-19 18:00:07 +000042 int omode; /* -1 = not open */
rsc2277c5d2004-03-21 04:33:13 +000043 File* file;
44 char* uid;
45 Qid qid;
46 void* aux;
47
48/* below is implementation-specific; don't use */
49 Readdir* rdir;
50 Ref ref;
51 Fidpool* pool;
52 vlong diroffset;
53 long dirindex;
54};
55
56struct Req
57{
58 ulong tag;
59 void* aux;
60 Fcall ifcall;
61 Fcall ofcall;
62 Dir d;
63 Req* oldreq;
64 Fid* fid;
65 Fid* afid;
66 Fid* newfid;
67 Srv* srv;
68
69/* below is implementation-specific; don't use */
70 QLock lk;
71 Ref ref;
72 Reqpool* pool;
73 uchar* buf;
74 uchar type;
75 uchar responded;
76 char* error;
77 void* rbuf;
78 Req** flush;
79 int nflush;
80};
81
82/*
83 * Pools to maintain Fid <-> fid and Req <-> tag maps.
84 */
85
86struct Fidpool {
87 Intmap *map;
88 void (*destroy)(Fid*);
89 Srv *srv;
90};
91
92struct Reqpool {
93 Intmap *map;
94 void (*destroy)(Req*);
95 Srv *srv;
96};
97
98Fidpool* allocfidpool(void (*destroy)(Fid*));
99void freefidpool(Fidpool*);
100Fid* allocfid(Fidpool*, ulong);
101Fid* lookupfid(Fidpool*, ulong);
102void closefid(Fid*);
103Fid* removefid(Fidpool*, ulong);
104
105Reqpool* allocreqpool(void (*destroy)(Req*));
106void freereqpool(Reqpool*);
107Req* allocreq(Reqpool*, ulong);
108Req* lookupreq(Reqpool*, ulong);
109void closereq(Req*);
110Req* removereq(Reqpool*, ulong);
111
112typedef int Dirgen(int, Dir*, void*);
113void dirread9p(Req*, Dirgen*, void*);
114
115/*
116 * File trees.
117 */
118struct File {
119 Ref ref;
120 Dir dir;
121 File *parent;
122 void *aux;
123
124/* below is implementation-specific; don't use */
125 RWLock rwlock;
126 Filelist *filelist;
127 Tree *tree;
128 int nchild;
129 int allocd;
130};
131
132struct Tree {
133 File *root;
134 void (*destroy)(File *file);
135
136/* below is implementation-specific; don't use */
137 Lock genlock;
138 ulong qidgen;
139 ulong dirqidgen;
140};
141
142Tree* alloctree(char*, char*, ulong, void(*destroy)(File*));
143void freetree(Tree*);
144File* createfile(File*, char*, char*, ulong, void*);
145int removefile(File*);
146void closefile(File*);
147File* walkfile(File*, char*);
148Readdir* opendirfile(File*);
149long readdirfile(Readdir*, uchar*, long);
150void closedirfile(Readdir*);
151
152/*
153 * Kernel-style command parser
154 */
155typedef struct Cmdbuf Cmdbuf;
156typedef struct Cmdtab Cmdtab;
157Cmdbuf* parsecmd(char *a, int n);
158void respondcmderror(Req*, Cmdbuf*, char*, ...);
159Cmdtab* lookupcmd(Cmdbuf*, Cmdtab*, int);
160/*
161#pragma varargck argpos respondcmderr 3
162*/
163struct Cmdbuf
164{
165 char *buf;
166 char **f;
167 int nf;
168};
169
170struct Cmdtab
171{
172 int index; /* used by client to switch on result */
173 char *cmd; /* command name */
174 int narg; /* expected #args; 0 ==> variadic */
175};
176
177/*
178 * File service loop.
179 */
180struct Srv {
181 Tree* tree;
182 void (*destroyfid)(Fid*);
183 void (*destroyreq)(Req*);
rscce2a3782005-02-10 16:08:16 +0000184 void (*start)(Srv*);
rsc2277c5d2004-03-21 04:33:13 +0000185 void (*end)(Srv*);
186 void* aux;
187
188 void (*attach)(Req*);
189 void (*auth)(Req*);
190 void (*open)(Req*);
191 void (*create)(Req*);
192 void (*read)(Req*);
193 void (*write)(Req*);
194 void (*remove)(Req*);
195 void (*flush)(Req*);
196 void (*stat)(Req*);
197 void (*wstat)(Req*);
198 void (*walk)(Req*);
199 char* (*clone)(Fid*, Fid*);
200 char* (*walk1)(Fid*, char*, Qid*);
201
202 int infd;
203 int outfd;
204 int nopipe;
205 int srvfd;
206 int leavefdsopen; /* magic for acme win */
207
208/* below is implementation-specific; don't use */
209 Fidpool* fpool;
210 Reqpool* rpool;
211 uint msize;
212
213 uchar* rbuf;
214 QLock rlock;
215 uchar* wbuf;
216 QLock wlock;
217};
218
219void srv(Srv*);
220void postmountsrv(Srv*, char*, char*, int);
221int postfd(char*, int);
rsc8ba38112005-03-04 14:47:18 +0000222extern int chatty9p;
rsc2277c5d2004-03-21 04:33:13 +0000223void respond(Req*, char*);
224void threadpostmountsrv(Srv*, char*, char*, int);
225
226/*
227 * Helper. Assumes user is same as group.
228 */
229int hasperm(File*, char*, int);
230
231void* emalloc9p(ulong);
232void* erealloc9p(void*, ulong);
233char* estrdup9p(char*);
234
235enum {
236 OMASK = 3
237};
238
239void readstr(Req*, char*);
240void readbuf(Req*, void*, long);
241void walkandclone(Req*, char*(*walk1)(Fid*,char*,void*), char*(*clone)(Fid*,Fid*,void*), void*);
242
243#ifdef __cplusplus
244}
245#endif
246#endif