Introduction
Introduction Statistics Contact Development Disclaimer Help
t9p.h - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
t9p.h (4498B)
---
1 #ifndef __9P_H__
2 #define __9P_H__ 1
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8 /*
9 #pragma src "/sys/src/lib9p"
10 #pragma lib "lib9p.a"
11 */
12 AUTOLIB(9p)
13
14 /*
15 * Maps from ulongs to void*s.
16 */
17 typedef struct Intmap Intmap;
18
19 Intmap* allocmap(void (*inc)(void*));
20 void freemap(Intmap*, void (*destroy)(void*));
21 void* lookupkey(Intmap*, ulong);
22 void* insertkey(Intmap*, ulong, void*);
23 int caninsertkey(Intmap*, ulong, void*);
24 void* deletekey(Intmap*, ulong);
25
26 /*
27 * Fid and Request structures.
28 */
29 typedef struct Fid Fid;
30 typedef struct Req Req;
31 typedef struct Fidpool Fidpool;
32 typedef struct Reqpool Reqpool;
33 typedef struct File File;
34 typedef struct Filelist Filelist;
35 typedef struct Tree Tree;
36 typedef struct Readdir Readdir;
37 typedef struct Srv Srv;
38
39 struct Fid
40 {
41 ulong fid;
42 int omode; /* -1 = not open */
43 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
56 struct 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
86 struct Fidpool {
87 Intmap *map;
88 void (*destroy)(Fid*);
89 Srv *srv;
90 };
91
92 struct Reqpool {
93 Intmap *map;
94 void (*destroy)(Req*);
95 Srv *srv;
96 };
97
98 Fidpool* allocfidpool(void (*destroy)(Fid*));
99 void freefidpool(Fidpool*);
100 Fid* allocfid(Fidpool*, ulong);
101 Fid* lookupfid(Fidpool*, ulong);
102 void closefid(Fid*);
103 Fid* removefid(Fidpool*, ulong);
104
105 Reqpool* allocreqpool(void (*destroy)(Req*));
106 void freereqpool(Reqpool*);
107 Req* allocreq(Reqpool*, ulong);
108 Req* lookupreq(Reqpool*, ulong);
109 void closereq(Req*);
110 Req* removereq(Reqpool*, ulong);
111
112 typedef int Dirgen(int, Dir*, void*);
113 void dirread9p(Req*, Dirgen*, void*);
114
115 /*
116 * File trees.
117 */
118 struct 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
132 struct 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
142 Tree* alloctree(char*, char*, ulong, void(*destroy)(File*));
143 void freetree(Tree*);
144 File* createfile(File*, char*, char*, ulong, void*);
145 int removefile(File*);
146 void closefile(File*);
147 File* walkfile(File*, char*);
148 Readdir* opendirfile(File*);
149 long readdirfile(Readdir*, uchar*, long);
150 void closedirfile(Readdir*);
151
152 /*
153 * Kernel-style command parser
154 */
155 typedef struct Cmdbuf Cmdbuf;
156 typedef struct Cmdtab Cmdtab;
157 Cmdbuf* parsecmd(char *a, int n);
158 void respondcmderror(Req*, Cmdbuf*, char*, ...);
159 Cmdtab* lookupcmd(Cmdbuf*, Cmdtab*, int);
160 /*
161 #pragma varargck argpos respondcmderr 3
162 */
163 struct Cmdbuf
164 {
165 char *buf;
166 char **f;
167 int nf;
168 };
169
170 struct 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 */
180 struct Srv {
181 Tree* tree;
182 void (*destroyfid)(Fid*);
183 void (*destroyreq)(Req*);
184 void (*start)(Srv*);
185 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 int foreground; /* run in foreground */
208 int fake;
209
210 /* below is implementation-specific; don't use */
211 Fidpool* fpool;
212 Reqpool* rpool;
213 uint msize;
214
215 uchar* rbuf;
216 QLock rlock;
217 uchar* wbuf;
218 QLock wlock;
219 };
220
221 void srv(Srv*);
222 int postfd(char*, int);
223 extern int chatty9p;
224 void respond(Req*, char*);
225 void threadpostmountsrv(Srv*, char*, char*, int);
226
227 /*
228 * Helper. Assumes user is same as group.
229 */
230 int hasperm(File*, char*, int);
231
232 void* emalloc9p(ulong);
233 void* erealloc9p(void*, ulong);
234 char* estrdup9p(char*);
235
236 enum {
237 OMASK = 3
238 };
239
240 void readstr(Req*, char*);
241 void readbuf(Req*, void*, long);
242 void walkandclone(Req*, char*(*walk1)(Fid*,char*,void*), char*(*c…
243
244 #ifdef __cplusplus
245 }
246 #endif
247 #endif
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.