Blame


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