Blame


1 7763a61a 2003-11-23 devnull #include "stdinc.h"
2 7763a61a 2003-11-23 devnull #include <fcall.h>
3 7763a61a 2003-11-23 devnull #include "vac.h"
4 7763a61a 2003-11-23 devnull
5 ada3d479 2008-06-15 rsc #ifndef PLAN9PORT
6 ada3d479 2008-06-15 rsc #define convM2Su(a, b, c, d) convM2S(a, b, c)
7 ada3d479 2008-06-15 rsc #define convS2Mu(a, b, c, d) convS2M(a, b, c)
8 ada3d479 2008-06-15 rsc #define convM2Du(a, b, c, d) convM2D(a, b, c)
9 ada3d479 2008-06-15 rsc #define convD2Mu(a, b, c, d) convD2M(a, b, c)
10 ada3d479 2008-06-15 rsc #endif
11 ada3d479 2008-06-15 rsc
12 7763a61a 2003-11-23 devnull typedef struct Fid Fid;
13 7763a61a 2003-11-23 devnull
14 7763a61a 2003-11-23 devnull enum
15 7763a61a 2003-11-23 devnull {
16 cbeb0b26 2006-04-01 devnull OPERM = 0x3 /* mask of all permission types in open mode */
17 7763a61a 2003-11-23 devnull };
18 7763a61a 2003-11-23 devnull
19 7763a61a 2003-11-23 devnull struct Fid
20 7763a61a 2003-11-23 devnull {
21 7763a61a 2003-11-23 devnull short busy;
22 7763a61a 2003-11-23 devnull short open;
23 7763a61a 2003-11-23 devnull int fid;
24 7763a61a 2003-11-23 devnull char *user;
25 7763a61a 2003-11-23 devnull Qid qid;
26 7763a61a 2003-11-23 devnull VacFile *file;
27 64f9764e 2008-06-14 rsc VacDirEnum *vde;
28 7763a61a 2003-11-23 devnull Fid *next;
29 7763a61a 2003-11-23 devnull };
30 7763a61a 2003-11-23 devnull
31 7763a61a 2003-11-23 devnull enum
32 7763a61a 2003-11-23 devnull {
33 7763a61a 2003-11-23 devnull Pexec = 1,
34 7763a61a 2003-11-23 devnull Pwrite = 2,
35 7763a61a 2003-11-23 devnull Pread = 4,
36 7763a61a 2003-11-23 devnull Pother = 1,
37 7763a61a 2003-11-23 devnull Pgroup = 8,
38 cbeb0b26 2006-04-01 devnull Powner = 64
39 7763a61a 2003-11-23 devnull };
40 7763a61a 2003-11-23 devnull
41 7763a61a 2003-11-23 devnull Fid *fids;
42 7763a61a 2003-11-23 devnull uchar *data;
43 7763a61a 2003-11-23 devnull int mfd[2];
44 ada3d479 2008-06-15 rsc int srvfd = -1;
45 7763a61a 2003-11-23 devnull char *user;
46 7763a61a 2003-11-23 devnull uchar mdata[8192+IOHDRSZ];
47 7763a61a 2003-11-23 devnull int messagesize = sizeof mdata;
48 7763a61a 2003-11-23 devnull Fcall rhdr;
49 7763a61a 2003-11-23 devnull Fcall thdr;
50 a20a1468 2005-01-16 devnull VacFs *fs;
51 a20a1468 2005-01-16 devnull VtConn *conn;
52 7763a61a 2003-11-23 devnull int noperm;
53 bbfdd7a6 2005-09-13 devnull int dotu;
54 be3e3514 2008-04-17 rsc char *defmnt;
55 7763a61a 2003-11-23 devnull
56 7763a61a 2003-11-23 devnull Fid * newfid(int);
57 7763a61a 2003-11-23 devnull void error(char*);
58 7763a61a 2003-11-23 devnull void io(void);
59 a331ac4c 2005-01-19 devnull void vacshutdown(void);
60 7763a61a 2003-11-23 devnull void usage(void);
61 7763a61a 2003-11-23 devnull int perm(Fid*, int);
62 7763a61a 2003-11-23 devnull int permf(VacFile*, char*, int);
63 7763a61a 2003-11-23 devnull ulong getl(void *p);
64 7763a61a 2003-11-23 devnull void init(char*, char*, long, int);
65 7763a61a 2003-11-23 devnull int vacdirread(Fid *f, char *p, long off, long cnt);
66 64f9764e 2008-06-14 rsc int vacstat(VacFile *parent, VacDir *vd, uchar *p, int np);
67 a20a1468 2005-01-16 devnull void srv(void* a);
68 7763a61a 2003-11-23 devnull
69 a20a1468 2005-01-16 devnull
70 7763a61a 2003-11-23 devnull char *rflush(Fid*), *rversion(Fid*),
71 7763a61a 2003-11-23 devnull *rauth(Fid*), *rattach(Fid*), *rwalk(Fid*),
72 7763a61a 2003-11-23 devnull *ropen(Fid*), *rcreate(Fid*),
73 7763a61a 2003-11-23 devnull *rread(Fid*), *rwrite(Fid*), *rclunk(Fid*),
74 7763a61a 2003-11-23 devnull *rremove(Fid*), *rstat(Fid*), *rwstat(Fid*);
75 7763a61a 2003-11-23 devnull
76 9b3d503b 2005-01-19 devnull char *(*fcalls[Tmax])(Fid*);
77 9b3d503b 2005-01-19 devnull
78 9b3d503b 2005-01-19 devnull void
79 9b3d503b 2005-01-19 devnull initfcalls(void)
80 9b3d503b 2005-01-19 devnull {
81 9b3d503b 2005-01-19 devnull fcalls[Tflush]= rflush;
82 9b3d503b 2005-01-19 devnull fcalls[Tversion]= rversion;
83 9b3d503b 2005-01-19 devnull fcalls[Tattach]= rattach;
84 9b3d503b 2005-01-19 devnull fcalls[Tauth]= rauth;
85 9b3d503b 2005-01-19 devnull fcalls[Twalk]= rwalk;
86 9b3d503b 2005-01-19 devnull fcalls[Topen]= ropen;
87 9b3d503b 2005-01-19 devnull fcalls[Tcreate]= rcreate;
88 9b3d503b 2005-01-19 devnull fcalls[Tread]= rread;
89 9b3d503b 2005-01-19 devnull fcalls[Twrite]= rwrite;
90 9b3d503b 2005-01-19 devnull fcalls[Tclunk]= rclunk;
91 9b3d503b 2005-01-19 devnull fcalls[Tremove]= rremove;
92 9b3d503b 2005-01-19 devnull fcalls[Tstat]= rstat;
93 9b3d503b 2005-01-19 devnull fcalls[Twstat]= rwstat;
94 edefa249 2005-03-15 devnull }
95 7763a61a 2003-11-23 devnull
96 7763a61a 2003-11-23 devnull char Eperm[] = "permission denied";
97 7763a61a 2003-11-23 devnull char Enotdir[] = "not a directory";
98 7763a61a 2003-11-23 devnull char Enotexist[] = "file does not exist";
99 7763a61a 2003-11-23 devnull char Einuse[] = "file in use";
100 7763a61a 2003-11-23 devnull char Eexist[] = "file exists";
101 7763a61a 2003-11-23 devnull char Enotowner[] = "not owner";
102 7763a61a 2003-11-23 devnull char Eisopen[] = "file already open for I/O";
103 7763a61a 2003-11-23 devnull char Excl[] = "exclusive use file already open";
104 7763a61a 2003-11-23 devnull char Ename[] = "illegal name";
105 7763a61a 2003-11-23 devnull char Erdonly[] = "read only file system";
106 7763a61a 2003-11-23 devnull char Eio[] = "i/o error";
107 7763a61a 2003-11-23 devnull char Eempty[] = "directory is not empty";
108 7763a61a 2003-11-23 devnull char Emode[] = "illegal mode";
109 7763a61a 2003-11-23 devnull
110 7763a61a 2003-11-23 devnull int dflag;
111 7763a61a 2003-11-23 devnull
112 7763a61a 2003-11-23 devnull void
113 7763a61a 2003-11-23 devnull notifyf(void *a, char *s)
114 7763a61a 2003-11-23 devnull {
115 7763a61a 2003-11-23 devnull USED(a);
116 7763a61a 2003-11-23 devnull if(strncmp(s, "interrupt", 9) == 0)
117 7763a61a 2003-11-23 devnull noted(NCONT);
118 7763a61a 2003-11-23 devnull noted(NDFLT);
119 7763a61a 2003-11-23 devnull }
120 7763a61a 2003-11-23 devnull
121 75d04888 2009-05-25 rsc #define TWID64 ~(u64int)0
122 75d04888 2009-05-25 rsc static u64int
123 75d04888 2009-05-25 rsc unittoull(char *s)
124 75d04888 2009-05-25 rsc {
125 75d04888 2009-05-25 rsc char *es;
126 75d04888 2009-05-25 rsc u64int n;
127 75d04888 2009-05-25 rsc
128 75d04888 2009-05-25 rsc if(s == nil)
129 75d04888 2009-05-25 rsc return TWID64;
130 75d04888 2009-05-25 rsc n = strtoul(s, &es, 0);
131 75d04888 2009-05-25 rsc if(*es == 'k' || *es == 'K'){
132 75d04888 2009-05-25 rsc n *= 1024;
133 75d04888 2009-05-25 rsc es++;
134 75d04888 2009-05-25 rsc }else if(*es == 'm' || *es == 'M'){
135 75d04888 2009-05-25 rsc n *= 1024*1024;
136 75d04888 2009-05-25 rsc es++;
137 75d04888 2009-05-25 rsc }else if(*es == 'g' || *es == 'G'){
138 75d04888 2009-05-25 rsc n *= 1024*1024*1024;
139 75d04888 2009-05-25 rsc es++;
140 75d04888 2009-05-25 rsc }
141 75d04888 2009-05-25 rsc if(*es != '\0')
142 75d04888 2009-05-25 rsc return TWID64;
143 75d04888 2009-05-25 rsc return n;
144 75d04888 2009-05-25 rsc }
145 75d04888 2009-05-25 rsc
146 7763a61a 2003-11-23 devnull void
147 a20a1468 2005-01-16 devnull threadmain(int argc, char *argv[])
148 7763a61a 2003-11-23 devnull {
149 ada3d479 2008-06-15 rsc char *defsrv, *srvname;
150 ada3d479 2008-06-15 rsc int p[2], fd;
151 ada3d479 2008-06-15 rsc int stdio;
152 7763a61a 2003-11-23 devnull char *host = nil;
153 75d04888 2009-05-25 rsc ulong mem;
154 7763a61a 2003-11-23 devnull
155 75d04888 2009-05-25 rsc mem = 16<<20;
156 ada3d479 2008-06-15 rsc stdio = 0;
157 23fb2edb 2005-07-24 devnull fmtinstall('H', encodefmt);
158 23fb2edb 2005-07-24 devnull fmtinstall('V', vtscorefmt);
159 23fb2edb 2005-07-24 devnull fmtinstall('F', vtfcallfmt);
160 23fb2edb 2005-07-24 devnull
161 ada3d479 2008-06-15 rsc defmnt = nil;
162 91124c1b 2005-01-16 devnull defsrv = nil;
163 7763a61a 2003-11-23 devnull ARGBEGIN{
164 7763a61a 2003-11-23 devnull case 'd':
165 7763a61a 2003-11-23 devnull fmtinstall('F', fcallfmt);
166 7763a61a 2003-11-23 devnull dflag = 1;
167 7763a61a 2003-11-23 devnull break;
168 7763a61a 2003-11-23 devnull case 'i':
169 ada3d479 2008-06-15 rsc defmnt = nil;
170 7763a61a 2003-11-23 devnull stdio = 1;
171 7763a61a 2003-11-23 devnull mfd[0] = 0;
172 7763a61a 2003-11-23 devnull mfd[1] = 1;
173 7763a61a 2003-11-23 devnull break;
174 7763a61a 2003-11-23 devnull case 'h':
175 32053cdf 2005-01-16 devnull host = EARGF(usage());
176 7763a61a 2003-11-23 devnull break;
177 ada3d479 2008-06-15 rsc case 'S':
178 32053cdf 2005-01-16 devnull defsrv = EARGF(usage());
179 7763a61a 2003-11-23 devnull break;
180 ada3d479 2008-06-15 rsc case 's':
181 ada3d479 2008-06-15 rsc defsrv = "vacfs";
182 75d04888 2009-05-25 rsc break;
183 75d04888 2009-05-25 rsc case 'M':
184 75d04888 2009-05-25 rsc mem = unittoull(EARGF(usage()));
185 ada3d479 2008-06-15 rsc break;
186 be3e3514 2008-04-17 rsc case 'm':
187 be3e3514 2008-04-17 rsc defmnt = EARGF(usage());
188 be3e3514 2008-04-17 rsc break;
189 7763a61a 2003-11-23 devnull case 'p':
190 7763a61a 2003-11-23 devnull noperm = 1;
191 7763a61a 2003-11-23 devnull break;
192 23fb2edb 2005-07-24 devnull case 'V':
193 23fb2edb 2005-07-24 devnull chattyventi = 1;
194 23fb2edb 2005-07-24 devnull break;
195 7763a61a 2003-11-23 devnull default:
196 7763a61a 2003-11-23 devnull usage();
197 7763a61a 2003-11-23 devnull }ARGEND
198 7763a61a 2003-11-23 devnull
199 7763a61a 2003-11-23 devnull if(argc != 1)
200 7763a61a 2003-11-23 devnull usage();
201 7763a61a 2003-11-23 devnull
202 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
203 ada3d479 2008-06-15 rsc if(defsrv == nil && defmnt == nil && !stdio){
204 ada3d479 2008-06-15 rsc srvname = strchr(argv[0], '/');
205 ada3d479 2008-06-15 rsc if(srvname)
206 ada3d479 2008-06-15 rsc srvname++;
207 ada3d479 2008-06-15 rsc else
208 ada3d479 2008-06-15 rsc srvname = argv[0];
209 ada3d479 2008-06-15 rsc defsrv = vtmalloc(6+strlen(srvname)+1);
210 ada3d479 2008-06-15 rsc strcpy(defsrv, "vacfs.");
211 ada3d479 2008-06-15 rsc strcat(defsrv, srvname);
212 ada3d479 2008-06-15 rsc if(strcmp(defsrv+strlen(defsrv)-4, ".vac") == 0)
213 ada3d479 2008-06-15 rsc defsrv[strlen(defsrv)-4] = 0;
214 ada3d479 2008-06-15 rsc }
215 ada3d479 2008-06-15 rsc #else
216 ada3d479 2008-06-15 rsc if(defsrv == nil && defmnt == nil && !stdio)
217 ada3d479 2008-06-15 rsc defmnt = "/n/vac";
218 ada3d479 2008-06-15 rsc #endif
219 ada3d479 2008-06-15 rsc if(stdio && defmnt)
220 ada3d479 2008-06-15 rsc sysfatal("cannot use -m with -i");
221 ada3d479 2008-06-15 rsc
222 9b3d503b 2005-01-19 devnull initfcalls();
223 7763a61a 2003-11-23 devnull
224 64f9764e 2008-06-14 rsc notify(notifyf);
225 64f9764e 2008-06-14 rsc user = getuser();
226 64f9764e 2008-06-14 rsc
227 64f9764e 2008-06-14 rsc conn = vtdial(host);
228 64f9764e 2008-06-14 rsc if(conn == nil)
229 64f9764e 2008-06-14 rsc sysfatal("could not connect to server: %r");
230 64f9764e 2008-06-14 rsc
231 64f9764e 2008-06-14 rsc if(vtconnect(conn) < 0)
232 64f9764e 2008-06-14 rsc sysfatal("vtconnect: %r");
233 64f9764e 2008-06-14 rsc
234 75d04888 2009-05-25 rsc fs = vacfsopen(conn, argv[0], VtOREAD, mem);
235 64f9764e 2008-06-14 rsc if(fs == nil)
236 64f9764e 2008-06-14 rsc sysfatal("vacfsopen: %r");
237 64f9764e 2008-06-14 rsc
238 ada3d479 2008-06-15 rsc if(!stdio){
239 ada3d479 2008-06-15 rsc if(pipe(p) < 0)
240 ada3d479 2008-06-15 rsc sysfatal("pipe failed: %r");
241 ada3d479 2008-06-15 rsc mfd[0] = p[0];
242 ada3d479 2008-06-15 rsc mfd[1] = p[0];
243 ada3d479 2008-06-15 rsc srvfd = p[1];
244 91124c1b 2005-01-16 devnull }
245 91124c1b 2005-01-16 devnull
246 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
247 ada3d479 2008-06-15 rsc USED(fd);
248 ada3d479 2008-06-15 rsc proccreate(srv, 0, 32 * 1024);
249 44c6e39c 2009-07-26 rsc if(!stdio && post9pservice(p[1], defsrv, defmnt) < 0)
250 a20a1468 2005-01-16 devnull sysfatal("post9pservice");
251 ada3d479 2008-06-15 rsc #else
252 ada3d479 2008-06-15 rsc procrfork(srv, 0, 32 * 1024, RFFDG|RFNAMEG|RFNOTEG);
253 a20a1468 2005-01-16 devnull
254 ada3d479 2008-06-15 rsc if(!stdio){
255 ada3d479 2008-06-15 rsc close(p[0]);
256 ada3d479 2008-06-15 rsc if(defsrv){
257 ada3d479 2008-06-15 rsc srvname = smprint("/srv/%s", defsrv);
258 ada3d479 2008-06-15 rsc fd = create(srvname, OWRITE|ORCLOSE, 0666);
259 ada3d479 2008-06-15 rsc if(fd < 0)
260 ada3d479 2008-06-15 rsc sysfatal("create %s: %r", srvname);
261 ada3d479 2008-06-15 rsc if(fprint(fd, "%d", srvfd) < 0)
262 ada3d479 2008-06-15 rsc sysfatal("write %s: %r", srvname);
263 ada3d479 2008-06-15 rsc free(srvname);
264 ada3d479 2008-06-15 rsc }
265 ada3d479 2008-06-15 rsc if(defmnt){
266 ada3d479 2008-06-15 rsc if(mount(srvfd, -1, defmnt, MREPL|MCREATE, "") < 0)
267 ada3d479 2008-06-15 rsc sysfatal("mount %s: %r", defmnt);
268 ada3d479 2008-06-15 rsc }
269 ada3d479 2008-06-15 rsc }
270 ada3d479 2008-06-15 rsc #endif
271 a20a1468 2005-01-16 devnull threadexits(0);
272 7763a61a 2003-11-23 devnull }
273 7763a61a 2003-11-23 devnull
274 a331ac4c 2005-01-19 devnull void
275 a331ac4c 2005-01-19 devnull srv(void *a)
276 a331ac4c 2005-01-19 devnull {
277 ada3d479 2008-06-15 rsc USED(a);
278 a20a1468 2005-01-16 devnull io();
279 a331ac4c 2005-01-19 devnull vacshutdown();
280 a20a1468 2005-01-16 devnull }
281 a20a1468 2005-01-16 devnull
282 7763a61a 2003-11-23 devnull void
283 7763a61a 2003-11-23 devnull usage(void)
284 7763a61a 2003-11-23 devnull {
285 7763a61a 2003-11-23 devnull fprint(2, "usage: %s [-sd] [-h host] [-c ncache] [-m mountpoint] vacfile\n", argv0);
286 38c10d1a 2005-01-17 devnull threadexitsall("usage");
287 7763a61a 2003-11-23 devnull }
288 7763a61a 2003-11-23 devnull
289 7763a61a 2003-11-23 devnull char*
290 7763a61a 2003-11-23 devnull rversion(Fid *unused)
291 7763a61a 2003-11-23 devnull {
292 7763a61a 2003-11-23 devnull Fid *f;
293 7763a61a 2003-11-23 devnull
294 7763a61a 2003-11-23 devnull USED(unused);
295 7763a61a 2003-11-23 devnull
296 7763a61a 2003-11-23 devnull for(f = fids; f; f = f->next)
297 7763a61a 2003-11-23 devnull if(f->busy)
298 7763a61a 2003-11-23 devnull rclunk(f);
299 7763a61a 2003-11-23 devnull
300 7763a61a 2003-11-23 devnull if(rhdr.msize < 256)
301 a20a1468 2005-01-16 devnull return vtstrdup("version: message size too small");
302 7763a61a 2003-11-23 devnull messagesize = rhdr.msize;
303 7763a61a 2003-11-23 devnull if(messagesize > sizeof mdata)
304 7763a61a 2003-11-23 devnull messagesize = sizeof mdata;
305 7763a61a 2003-11-23 devnull thdr.msize = messagesize;
306 7763a61a 2003-11-23 devnull if(strncmp(rhdr.version, "9P2000", 6) != 0)
307 a20a1468 2005-01-16 devnull return vtstrdup("unrecognized 9P version");
308 7763a61a 2003-11-23 devnull thdr.version = "9P2000";
309 bbfdd7a6 2005-09-13 devnull if(strncmp(rhdr.version, "9P2000.u", 8) == 0){
310 bbfdd7a6 2005-09-13 devnull dotu = 1;
311 bbfdd7a6 2005-09-13 devnull thdr.version = "9P2000.u";
312 bbfdd7a6 2005-09-13 devnull }
313 7763a61a 2003-11-23 devnull return nil;
314 7763a61a 2003-11-23 devnull }
315 7763a61a 2003-11-23 devnull
316 7763a61a 2003-11-23 devnull char*
317 7763a61a 2003-11-23 devnull rflush(Fid *f)
318 7763a61a 2003-11-23 devnull {
319 7763a61a 2003-11-23 devnull USED(f);
320 7763a61a 2003-11-23 devnull return 0;
321 7763a61a 2003-11-23 devnull }
322 7763a61a 2003-11-23 devnull
323 7763a61a 2003-11-23 devnull char*
324 7763a61a 2003-11-23 devnull rauth(Fid *f)
325 7763a61a 2003-11-23 devnull {
326 7763a61a 2003-11-23 devnull USED(f);
327 a20a1468 2005-01-16 devnull return vtstrdup("vacfs: authentication not required");
328 7763a61a 2003-11-23 devnull }
329 7763a61a 2003-11-23 devnull
330 7763a61a 2003-11-23 devnull char*
331 7763a61a 2003-11-23 devnull rattach(Fid *f)
332 7763a61a 2003-11-23 devnull {
333 7763a61a 2003-11-23 devnull /* no authentication for the momment */
334 7763a61a 2003-11-23 devnull VacFile *file;
335 a20a1468 2005-01-16 devnull char err[80];
336 7763a61a 2003-11-23 devnull
337 a20a1468 2005-01-16 devnull file = vacfsgetroot(fs);
338 a20a1468 2005-01-16 devnull if(file == nil) {
339 a20a1468 2005-01-16 devnull rerrstr(err, sizeof err);
340 a20a1468 2005-01-16 devnull return vtstrdup(err);
341 a20a1468 2005-01-16 devnull }
342 a20a1468 2005-01-16 devnull
343 7763a61a 2003-11-23 devnull f->busy = 1;
344 7763a61a 2003-11-23 devnull f->file = file;
345 9b3d503b 2005-01-19 devnull f->qid.path = vacfilegetid(f->file);
346 9b3d503b 2005-01-19 devnull f->qid.vers = 0;
347 9b3d503b 2005-01-19 devnull f->qid.type = QTDIR;
348 7763a61a 2003-11-23 devnull thdr.qid = f->qid;
349 7763a61a 2003-11-23 devnull if(rhdr.uname[0])
350 a20a1468 2005-01-16 devnull f->user = vtstrdup(rhdr.uname);
351 7763a61a 2003-11-23 devnull else
352 7763a61a 2003-11-23 devnull f->user = "none";
353 7763a61a 2003-11-23 devnull return 0;
354 7763a61a 2003-11-23 devnull }
355 7763a61a 2003-11-23 devnull
356 7763a61a 2003-11-23 devnull char*
357 7763a61a 2003-11-23 devnull rwalk(Fid *f)
358 7763a61a 2003-11-23 devnull {
359 7763a61a 2003-11-23 devnull VacFile *file, *nfile;
360 7763a61a 2003-11-23 devnull Fid *nf;
361 7763a61a 2003-11-23 devnull int nqid, nwname;
362 7763a61a 2003-11-23 devnull Qid qid;
363 a20a1468 2005-01-16 devnull char *err = nil;
364 7763a61a 2003-11-23 devnull
365 7763a61a 2003-11-23 devnull if(f->busy == 0)
366 7763a61a 2003-11-23 devnull return Enotexist;
367 7763a61a 2003-11-23 devnull nf = nil;
368 7763a61a 2003-11-23 devnull if(rhdr.fid != rhdr.newfid){
369 7763a61a 2003-11-23 devnull if(f->open)
370 a20a1468 2005-01-16 devnull return vtstrdup(Eisopen);
371 7763a61a 2003-11-23 devnull if(f->busy == 0)
372 a20a1468 2005-01-16 devnull return vtstrdup(Enotexist);
373 7763a61a 2003-11-23 devnull nf = newfid(rhdr.newfid);
374 7763a61a 2003-11-23 devnull if(nf->busy)
375 a20a1468 2005-01-16 devnull return vtstrdup(Eisopen);
376 7763a61a 2003-11-23 devnull nf->busy = 1;
377 7763a61a 2003-11-23 devnull nf->open = 0;
378 7763a61a 2003-11-23 devnull nf->qid = f->qid;
379 a20a1468 2005-01-16 devnull nf->file = vacfileincref(f->file);
380 a20a1468 2005-01-16 devnull nf->user = vtstrdup(f->user);
381 7763a61a 2003-11-23 devnull f = nf;
382 7763a61a 2003-11-23 devnull }
383 7763a61a 2003-11-23 devnull
384 7763a61a 2003-11-23 devnull nwname = rhdr.nwname;
385 7763a61a 2003-11-23 devnull
386 7763a61a 2003-11-23 devnull /* easy case */
387 7763a61a 2003-11-23 devnull if(nwname == 0) {
388 7763a61a 2003-11-23 devnull thdr.nwqid = 0;
389 7763a61a 2003-11-23 devnull return 0;
390 7763a61a 2003-11-23 devnull }
391 7763a61a 2003-11-23 devnull
392 7763a61a 2003-11-23 devnull file = f->file;
393 a20a1468 2005-01-16 devnull vacfileincref(file);
394 7763a61a 2003-11-23 devnull qid = f->qid;
395 7763a61a 2003-11-23 devnull
396 7763a61a 2003-11-23 devnull for(nqid = 0; nqid < nwname; nqid++){
397 7763a61a 2003-11-23 devnull if((qid.type & QTDIR) == 0){
398 a20a1468 2005-01-16 devnull err = Enotdir;
399 7763a61a 2003-11-23 devnull break;
400 7763a61a 2003-11-23 devnull }
401 7763a61a 2003-11-23 devnull if(!permf(file, f->user, Pexec)) {
402 a20a1468 2005-01-16 devnull err = Eperm;
403 7763a61a 2003-11-23 devnull break;
404 7763a61a 2003-11-23 devnull }
405 64f9764e 2008-06-14 rsc nfile = vacfilewalk(file, rhdr.wname[nqid]);
406 7763a61a 2003-11-23 devnull if(nfile == nil)
407 7763a61a 2003-11-23 devnull break;
408 a20a1468 2005-01-16 devnull vacfiledecref(file);
409 7763a61a 2003-11-23 devnull file = nfile;
410 7763a61a 2003-11-23 devnull qid.type = QTFILE;
411 a20a1468 2005-01-16 devnull if(vacfileisdir(file))
412 7763a61a 2003-11-23 devnull qid.type = QTDIR;
413 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
414 bbfdd7a6 2005-09-13 devnull if(vacfilegetmode(file)&ModeLink)
415 bbfdd7a6 2005-09-13 devnull qid.type = QTSYMLINK;
416 ada3d479 2008-06-15 rsc #endif
417 a20a1468 2005-01-16 devnull qid.vers = vacfilegetmcount(file);
418 a20a1468 2005-01-16 devnull qid.path = vacfilegetid(file);
419 7763a61a 2003-11-23 devnull thdr.wqid[nqid] = qid;
420 7763a61a 2003-11-23 devnull }
421 7763a61a 2003-11-23 devnull
422 7763a61a 2003-11-23 devnull thdr.nwqid = nqid;
423 7763a61a 2003-11-23 devnull
424 7763a61a 2003-11-23 devnull if(nqid == nwname){
425 7763a61a 2003-11-23 devnull /* success */
426 7763a61a 2003-11-23 devnull f->qid = thdr.wqid[nqid-1];
427 a20a1468 2005-01-16 devnull vacfiledecref(f->file);
428 7763a61a 2003-11-23 devnull f->file = file;
429 7763a61a 2003-11-23 devnull return 0;
430 7763a61a 2003-11-23 devnull }
431 7763a61a 2003-11-23 devnull
432 a20a1468 2005-01-16 devnull vacfiledecref(file);
433 7763a61a 2003-11-23 devnull if(nf != nil)
434 7763a61a 2003-11-23 devnull rclunk(nf);
435 7763a61a 2003-11-23 devnull
436 7763a61a 2003-11-23 devnull /* only error on the first element */
437 7763a61a 2003-11-23 devnull if(nqid == 0)
438 a20a1468 2005-01-16 devnull return vtstrdup(err);
439 7763a61a 2003-11-23 devnull
440 7763a61a 2003-11-23 devnull return 0;
441 7763a61a 2003-11-23 devnull }
442 7763a61a 2003-11-23 devnull
443 7763a61a 2003-11-23 devnull char *
444 7763a61a 2003-11-23 devnull ropen(Fid *f)
445 7763a61a 2003-11-23 devnull {
446 7763a61a 2003-11-23 devnull int mode, trunc;
447 7763a61a 2003-11-23 devnull
448 7763a61a 2003-11-23 devnull if(f->open)
449 a20a1468 2005-01-16 devnull return vtstrdup(Eisopen);
450 7763a61a 2003-11-23 devnull if(!f->busy)
451 a20a1468 2005-01-16 devnull return vtstrdup(Enotexist);
452 a20a1468 2005-01-16 devnull
453 7763a61a 2003-11-23 devnull mode = rhdr.mode;
454 7763a61a 2003-11-23 devnull thdr.iounit = messagesize - IOHDRSZ;
455 7763a61a 2003-11-23 devnull if(f->qid.type & QTDIR){
456 7763a61a 2003-11-23 devnull if(mode != OREAD)
457 a20a1468 2005-01-16 devnull return vtstrdup(Eperm);
458 7763a61a 2003-11-23 devnull if(!perm(f, Pread))
459 a20a1468 2005-01-16 devnull return vtstrdup(Eperm);
460 7763a61a 2003-11-23 devnull thdr.qid = f->qid;
461 64f9764e 2008-06-14 rsc f->vde = nil;
462 7763a61a 2003-11-23 devnull f->open = 1;
463 7763a61a 2003-11-23 devnull return 0;
464 7763a61a 2003-11-23 devnull }
465 7763a61a 2003-11-23 devnull if(mode & ORCLOSE)
466 a20a1468 2005-01-16 devnull return vtstrdup(Erdonly);
467 7763a61a 2003-11-23 devnull trunc = mode & OTRUNC;
468 7763a61a 2003-11-23 devnull mode &= OPERM;
469 7763a61a 2003-11-23 devnull if(mode==OWRITE || mode==ORDWR || trunc)
470 7763a61a 2003-11-23 devnull if(!perm(f, Pwrite))
471 a20a1468 2005-01-16 devnull return vtstrdup(Eperm);
472 7763a61a 2003-11-23 devnull if(mode==OREAD || mode==ORDWR)
473 7763a61a 2003-11-23 devnull if(!perm(f, Pread))
474 a20a1468 2005-01-16 devnull return vtstrdup(Eperm);
475 7763a61a 2003-11-23 devnull if(mode==OEXEC)
476 7763a61a 2003-11-23 devnull if(!perm(f, Pexec))
477 a20a1468 2005-01-16 devnull return vtstrdup(Eperm);
478 7763a61a 2003-11-23 devnull thdr.qid = f->qid;
479 7763a61a 2003-11-23 devnull thdr.iounit = messagesize - IOHDRSZ;
480 7763a61a 2003-11-23 devnull f->open = 1;
481 7763a61a 2003-11-23 devnull return 0;
482 7763a61a 2003-11-23 devnull }
483 7763a61a 2003-11-23 devnull
484 7763a61a 2003-11-23 devnull char*
485 7763a61a 2003-11-23 devnull rcreate(Fid* fid)
486 7763a61a 2003-11-23 devnull {
487 7763a61a 2003-11-23 devnull VacFile *vf;
488 7763a61a 2003-11-23 devnull ulong mode;
489 7763a61a 2003-11-23 devnull
490 7763a61a 2003-11-23 devnull if(fid->open)
491 a20a1468 2005-01-16 devnull return vtstrdup(Eisopen);
492 7763a61a 2003-11-23 devnull if(!fid->busy)
493 a20a1468 2005-01-16 devnull return vtstrdup(Enotexist);
494 a20a1468 2005-01-16 devnull if(fs->mode & ModeSnapshot)
495 a20a1468 2005-01-16 devnull return vtstrdup(Erdonly);
496 7763a61a 2003-11-23 devnull vf = fid->file;
497 a20a1468 2005-01-16 devnull if(!vacfileisdir(vf))
498 a20a1468 2005-01-16 devnull return vtstrdup(Enotdir);
499 7763a61a 2003-11-23 devnull if(!permf(vf, fid->user, Pwrite))
500 a20a1468 2005-01-16 devnull return vtstrdup(Eperm);
501 7763a61a 2003-11-23 devnull
502 7763a61a 2003-11-23 devnull mode = rhdr.perm & 0777;
503 7763a61a 2003-11-23 devnull
504 7763a61a 2003-11-23 devnull if(rhdr.perm & DMDIR){
505 7763a61a 2003-11-23 devnull if((rhdr.mode & OTRUNC) || (rhdr.perm & DMAPPEND))
506 a20a1468 2005-01-16 devnull return vtstrdup(Emode);
507 7763a61a 2003-11-23 devnull switch(rhdr.mode & OPERM){
508 7763a61a 2003-11-23 devnull default:
509 a20a1468 2005-01-16 devnull return vtstrdup(Emode);
510 7763a61a 2003-11-23 devnull case OEXEC:
511 7763a61a 2003-11-23 devnull case OREAD:
512 7763a61a 2003-11-23 devnull break;
513 7763a61a 2003-11-23 devnull case OWRITE:
514 7763a61a 2003-11-23 devnull case ORDWR:
515 a20a1468 2005-01-16 devnull return vtstrdup(Eperm);
516 7763a61a 2003-11-23 devnull }
517 7763a61a 2003-11-23 devnull mode |= ModeDir;
518 7763a61a 2003-11-23 devnull }
519 ecc0a1b0 2008-06-15 rsc vf = vacfilecreate(vf, rhdr.name, mode);
520 a20a1468 2005-01-16 devnull if(vf == nil) {
521 a20a1468 2005-01-16 devnull char err[80];
522 a20a1468 2005-01-16 devnull rerrstr(err, sizeof err);
523 7763a61a 2003-11-23 devnull
524 a20a1468 2005-01-16 devnull return vtstrdup(err);
525 a20a1468 2005-01-16 devnull }
526 a20a1468 2005-01-16 devnull
527 a20a1468 2005-01-16 devnull vacfiledecref(fid->file);
528 a20a1468 2005-01-16 devnull
529 7763a61a 2003-11-23 devnull fid->file = vf;
530 7763a61a 2003-11-23 devnull fid->qid.type = QTFILE;
531 a20a1468 2005-01-16 devnull if(vacfileisdir(vf))
532 7763a61a 2003-11-23 devnull fid->qid.type = QTDIR;
533 a20a1468 2005-01-16 devnull fid->qid.vers = vacfilegetmcount(vf);
534 a20a1468 2005-01-16 devnull fid->qid.path = vacfilegetid(vf);
535 7763a61a 2003-11-23 devnull
536 7763a61a 2003-11-23 devnull thdr.qid = fid->qid;
537 7763a61a 2003-11-23 devnull thdr.iounit = messagesize - IOHDRSZ;
538 7763a61a 2003-11-23 devnull
539 7763a61a 2003-11-23 devnull return 0;
540 7763a61a 2003-11-23 devnull }
541 7763a61a 2003-11-23 devnull
542 7763a61a 2003-11-23 devnull char*
543 7763a61a 2003-11-23 devnull rread(Fid *f)
544 7763a61a 2003-11-23 devnull {
545 7763a61a 2003-11-23 devnull char *buf;
546 7763a61a 2003-11-23 devnull vlong off;
547 7763a61a 2003-11-23 devnull int cnt;
548 7763a61a 2003-11-23 devnull VacFile *vf;
549 a20a1468 2005-01-16 devnull char err[80];
550 7763a61a 2003-11-23 devnull int n;
551 7763a61a 2003-11-23 devnull
552 7763a61a 2003-11-23 devnull if(!f->busy)
553 a20a1468 2005-01-16 devnull return vtstrdup(Enotexist);
554 7763a61a 2003-11-23 devnull vf = f->file;
555 7763a61a 2003-11-23 devnull thdr.count = 0;
556 7763a61a 2003-11-23 devnull off = rhdr.offset;
557 7763a61a 2003-11-23 devnull buf = thdr.data;
558 7763a61a 2003-11-23 devnull cnt = rhdr.count;
559 7763a61a 2003-11-23 devnull if(f->qid.type & QTDIR)
560 7763a61a 2003-11-23 devnull n = vacdirread(f, buf, off, cnt);
561 bbfdd7a6 2005-09-13 devnull else if(vacfilegetmode(f->file)&ModeDevice)
562 bbfdd7a6 2005-09-13 devnull return vtstrdup("device");
563 bbfdd7a6 2005-09-13 devnull else if(vacfilegetmode(f->file)&ModeLink)
564 bbfdd7a6 2005-09-13 devnull return vtstrdup("symbolic link");
565 bbfdd7a6 2005-09-13 devnull else if(vacfilegetmode(f->file)&ModeNamedPipe)
566 bbfdd7a6 2005-09-13 devnull return vtstrdup("named pipe");
567 7763a61a 2003-11-23 devnull else
568 a20a1468 2005-01-16 devnull n = vacfileread(vf, buf, cnt, off);
569 7763a61a 2003-11-23 devnull if(n < 0) {
570 a20a1468 2005-01-16 devnull rerrstr(err, sizeof err);
571 a20a1468 2005-01-16 devnull return vtstrdup(err);
572 7763a61a 2003-11-23 devnull }
573 7763a61a 2003-11-23 devnull thdr.count = n;
574 7763a61a 2003-11-23 devnull return 0;
575 7763a61a 2003-11-23 devnull }
576 7763a61a 2003-11-23 devnull
577 7763a61a 2003-11-23 devnull char*
578 7763a61a 2003-11-23 devnull rwrite(Fid *f)
579 7763a61a 2003-11-23 devnull {
580 ada3d479 2008-06-15 rsc USED(f);
581 c52cda30 2008-06-14 rsc return vtstrdup(Erdonly);
582 7763a61a 2003-11-23 devnull }
583 7763a61a 2003-11-23 devnull
584 7763a61a 2003-11-23 devnull char *
585 7763a61a 2003-11-23 devnull rclunk(Fid *f)
586 7763a61a 2003-11-23 devnull {
587 7763a61a 2003-11-23 devnull f->busy = 0;
588 7763a61a 2003-11-23 devnull f->open = 0;
589 a20a1468 2005-01-16 devnull vtfree(f->user);
590 7763a61a 2003-11-23 devnull f->user = nil;
591 9e2f1d9b 2005-11-21 devnull if(f->file)
592 9e2f1d9b 2005-11-21 devnull vacfiledecref(f->file);
593 7763a61a 2003-11-23 devnull f->file = nil;
594 64f9764e 2008-06-14 rsc vdeclose(f->vde);
595 64f9764e 2008-06-14 rsc f->vde = nil;
596 7763a61a 2003-11-23 devnull return 0;
597 7763a61a 2003-11-23 devnull }
598 7763a61a 2003-11-23 devnull
599 7763a61a 2003-11-23 devnull char *
600 7763a61a 2003-11-23 devnull rremove(Fid *f)
601 7763a61a 2003-11-23 devnull {
602 7763a61a 2003-11-23 devnull VacFile *vf, *vfp;
603 a20a1468 2005-01-16 devnull char errbuf[80];
604 7763a61a 2003-11-23 devnull char *err = nil;
605 7763a61a 2003-11-23 devnull
606 7763a61a 2003-11-23 devnull if(!f->busy)
607 a20a1468 2005-01-16 devnull return vtstrdup(Enotexist);
608 7763a61a 2003-11-23 devnull vf = f->file;
609 a20a1468 2005-01-16 devnull vfp = vacfilegetparent(vf);
610 7763a61a 2003-11-23 devnull
611 7763a61a 2003-11-23 devnull if(!permf(vfp, f->user, Pwrite)) {
612 7763a61a 2003-11-23 devnull err = Eperm;
613 7763a61a 2003-11-23 devnull goto Exit;
614 7763a61a 2003-11-23 devnull }
615 7763a61a 2003-11-23 devnull
616 ecc0a1b0 2008-06-15 rsc if(!vacfileremove(vf)) {
617 a20a1468 2005-01-16 devnull rerrstr(errbuf, sizeof errbuf);
618 a20a1468 2005-01-16 devnull err = errbuf;
619 7763a61a 2003-11-23 devnull }
620 7763a61a 2003-11-23 devnull
621 7763a61a 2003-11-23 devnull Exit:
622 a20a1468 2005-01-16 devnull vacfiledecref(vfp);
623 7763a61a 2003-11-23 devnull rclunk(f);
624 a20a1468 2005-01-16 devnull return vtstrdup(err);
625 7763a61a 2003-11-23 devnull }
626 7763a61a 2003-11-23 devnull
627 7763a61a 2003-11-23 devnull char *
628 7763a61a 2003-11-23 devnull rstat(Fid *f)
629 7763a61a 2003-11-23 devnull {
630 7763a61a 2003-11-23 devnull VacDir dir;
631 7763a61a 2003-11-23 devnull static uchar statbuf[1024];
632 bbfdd7a6 2005-09-13 devnull VacFile *parent;
633 bbfdd7a6 2005-09-13 devnull
634 7763a61a 2003-11-23 devnull if(!f->busy)
635 a20a1468 2005-01-16 devnull return vtstrdup(Enotexist);
636 bbfdd7a6 2005-09-13 devnull parent = vacfilegetparent(f->file);
637 a20a1468 2005-01-16 devnull vacfilegetdir(f->file, &dir);
638 7763a61a 2003-11-23 devnull thdr.stat = statbuf;
639 64f9764e 2008-06-14 rsc thdr.nstat = vacstat(parent, &dir, thdr.stat, sizeof statbuf);
640 a20a1468 2005-01-16 devnull vdcleanup(&dir);
641 bbfdd7a6 2005-09-13 devnull vacfiledecref(parent);
642 7763a61a 2003-11-23 devnull return 0;
643 7763a61a 2003-11-23 devnull }
644 7763a61a 2003-11-23 devnull
645 7763a61a 2003-11-23 devnull char *
646 7763a61a 2003-11-23 devnull rwstat(Fid *f)
647 7763a61a 2003-11-23 devnull {
648 7763a61a 2003-11-23 devnull if(!f->busy)
649 a20a1468 2005-01-16 devnull return vtstrdup(Enotexist);
650 a20a1468 2005-01-16 devnull return vtstrdup(Erdonly);
651 7763a61a 2003-11-23 devnull }
652 7763a61a 2003-11-23 devnull
653 7763a61a 2003-11-23 devnull int
654 64f9764e 2008-06-14 rsc vacstat(VacFile *parent, VacDir *vd, uchar *p, int np)
655 7763a61a 2003-11-23 devnull {
656 ada3d479 2008-06-15 rsc int ret;
657 7763a61a 2003-11-23 devnull Dir dir;
658 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
659 ada3d479 2008-06-15 rsc int n;
660 bbfdd7a6 2005-09-13 devnull VacFile *vf;
661 ada3d479 2008-06-15 rsc uvlong size;
662 ada3d479 2008-06-15 rsc char *ext = nil;
663 ada3d479 2008-06-15 rsc #endif
664 ada3d479 2008-06-15 rsc
665 7763a61a 2003-11-23 devnull memset(&dir, 0, sizeof(dir));
666 7763a61a 2003-11-23 devnull
667 fa3c8da1 2008-06-15 rsc dir.qid.path = vd->qid + vacfilegetqidoffset(parent);
668 fa3c8da1 2008-06-15 rsc if(vd->qidspace)
669 fa3c8da1 2008-06-15 rsc dir.qid.path += vd->qidoffset;
670 7763a61a 2003-11-23 devnull dir.qid.vers = vd->mcount;
671 7763a61a 2003-11-23 devnull dir.mode = vd->mode & 0777;
672 7763a61a 2003-11-23 devnull if(vd->mode & ModeAppend){
673 7763a61a 2003-11-23 devnull dir.qid.type |= QTAPPEND;
674 7763a61a 2003-11-23 devnull dir.mode |= DMAPPEND;
675 7763a61a 2003-11-23 devnull }
676 7763a61a 2003-11-23 devnull if(vd->mode & ModeExclusive){
677 7763a61a 2003-11-23 devnull dir.qid.type |= QTEXCL;
678 7763a61a 2003-11-23 devnull dir.mode |= DMEXCL;
679 7763a61a 2003-11-23 devnull }
680 7763a61a 2003-11-23 devnull if(vd->mode & ModeDir){
681 7763a61a 2003-11-23 devnull dir.qid.type |= QTDIR;
682 7763a61a 2003-11-23 devnull dir.mode |= DMDIR;
683 7763a61a 2003-11-23 devnull }
684 bbfdd7a6 2005-09-13 devnull
685 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
686 bbfdd7a6 2005-09-13 devnull if(vd->mode & (ModeLink|ModeDevice|ModeNamedPipe)){
687 bbfdd7a6 2005-09-13 devnull vf = vacfilewalk(parent, vd->elem);
688 bbfdd7a6 2005-09-13 devnull if(vf == nil)
689 bbfdd7a6 2005-09-13 devnull return 0;
690 bbfdd7a6 2005-09-13 devnull vacfilegetsize(vf, &size);
691 bbfdd7a6 2005-09-13 devnull ext = malloc(size+1);
692 bbfdd7a6 2005-09-13 devnull if(ext == nil)
693 bbfdd7a6 2005-09-13 devnull return 0;
694 bbfdd7a6 2005-09-13 devnull n = vacfileread(vf, ext, size, 0);
695 bbfdd7a6 2005-09-13 devnull ext[size] = 0;
696 bbfdd7a6 2005-09-13 devnull vacfiledecref(vf);
697 bbfdd7a6 2005-09-13 devnull if(vd->mode & ModeLink){
698 bbfdd7a6 2005-09-13 devnull dir.qid.type |= QTSYMLINK;
699 bbfdd7a6 2005-09-13 devnull dir.mode |= DMSYMLINK;
700 bbfdd7a6 2005-09-13 devnull }
701 bbfdd7a6 2005-09-13 devnull if(vd->mode & ModeDevice)
702 bbfdd7a6 2005-09-13 devnull dir.mode |= DMDEVICE;
703 bbfdd7a6 2005-09-13 devnull if(vd->mode & ModeNamedPipe)
704 bbfdd7a6 2005-09-13 devnull dir.mode |= DMNAMEDPIPE;
705 bbfdd7a6 2005-09-13 devnull }
706 ada3d479 2008-06-15 rsc #endif
707 bbfdd7a6 2005-09-13 devnull
708 7763a61a 2003-11-23 devnull dir.atime = vd->atime;
709 7763a61a 2003-11-23 devnull dir.mtime = vd->mtime;
710 7763a61a 2003-11-23 devnull dir.length = vd->size;
711 7763a61a 2003-11-23 devnull
712 7763a61a 2003-11-23 devnull dir.name = vd->elem;
713 7763a61a 2003-11-23 devnull dir.uid = vd->uid;
714 7763a61a 2003-11-23 devnull dir.gid = vd->gid;
715 7763a61a 2003-11-23 devnull dir.muid = vd->mid;
716 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
717 bbfdd7a6 2005-09-13 devnull dir.ext = ext;
718 2cb7bf88 2007-01-18 devnull dir.uidnum = atoi(vd->uid);
719 2cb7bf88 2007-01-18 devnull dir.gidnum = atoi(vd->gid);
720 ada3d479 2008-06-15 rsc #endif
721 7763a61a 2003-11-23 devnull
722 bbfdd7a6 2005-09-13 devnull ret = convD2Mu(&dir, p, np, dotu);
723 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
724 bbfdd7a6 2005-09-13 devnull free(ext);
725 ada3d479 2008-06-15 rsc #endif
726 bbfdd7a6 2005-09-13 devnull return ret;
727 7763a61a 2003-11-23 devnull }
728 7763a61a 2003-11-23 devnull
729 7763a61a 2003-11-23 devnull int
730 7763a61a 2003-11-23 devnull vacdirread(Fid *f, char *p, long off, long cnt)
731 7763a61a 2003-11-23 devnull {
732 64f9764e 2008-06-14 rsc int i, n, nb;
733 64f9764e 2008-06-14 rsc VacDir vd;
734 7763a61a 2003-11-23 devnull
735 7763a61a 2003-11-23 devnull /*
736 7763a61a 2003-11-23 devnull * special case of rewinding a directory
737 7763a61a 2003-11-23 devnull * otherwise ignore the offset
738 7763a61a 2003-11-23 devnull */
739 64f9764e 2008-06-14 rsc if(off == 0 && f->vde){
740 64f9764e 2008-06-14 rsc vdeclose(f->vde);
741 64f9764e 2008-06-14 rsc f->vde = nil;
742 7763a61a 2003-11-23 devnull }
743 7763a61a 2003-11-23 devnull
744 64f9764e 2008-06-14 rsc if(f->vde == nil){
745 64f9764e 2008-06-14 rsc f->vde = vdeopen(f->file);
746 64f9764e 2008-06-14 rsc if(f->vde == nil)
747 64f9764e 2008-06-14 rsc return -1;
748 64f9764e 2008-06-14 rsc }
749 7763a61a 2003-11-23 devnull
750 7763a61a 2003-11-23 devnull for(nb = 0; nb < cnt; nb += n) {
751 64f9764e 2008-06-14 rsc i = vderead(f->vde, &vd);
752 64f9764e 2008-06-14 rsc if(i < 0)
753 64f9764e 2008-06-14 rsc return -1;
754 64f9764e 2008-06-14 rsc if(i == 0)
755 7763a61a 2003-11-23 devnull break;
756 64f9764e 2008-06-14 rsc n = vacstat(f->file, &vd, (uchar*)p, cnt-nb);
757 7763a61a 2003-11-23 devnull if(n <= BIT16SZ) {
758 64f9764e 2008-06-14 rsc vdeunread(f->vde);
759 7763a61a 2003-11-23 devnull break;
760 7763a61a 2003-11-23 devnull }
761 64f9764e 2008-06-14 rsc vdcleanup(&vd);
762 7763a61a 2003-11-23 devnull p += n;
763 7763a61a 2003-11-23 devnull }
764 7763a61a 2003-11-23 devnull return nb;
765 7763a61a 2003-11-23 devnull }
766 7763a61a 2003-11-23 devnull
767 7763a61a 2003-11-23 devnull Fid *
768 7763a61a 2003-11-23 devnull newfid(int fid)
769 7763a61a 2003-11-23 devnull {
770 7763a61a 2003-11-23 devnull Fid *f, *ff;
771 7763a61a 2003-11-23 devnull
772 7763a61a 2003-11-23 devnull ff = 0;
773 7763a61a 2003-11-23 devnull for(f = fids; f; f = f->next)
774 7763a61a 2003-11-23 devnull if(f->fid == fid)
775 7763a61a 2003-11-23 devnull return f;
776 7763a61a 2003-11-23 devnull else if(!ff && !f->busy)
777 7763a61a 2003-11-23 devnull ff = f;
778 7763a61a 2003-11-23 devnull if(ff){
779 7763a61a 2003-11-23 devnull ff->fid = fid;
780 7763a61a 2003-11-23 devnull return ff;
781 7763a61a 2003-11-23 devnull }
782 a20a1468 2005-01-16 devnull f = vtmallocz(sizeof *f);
783 7763a61a 2003-11-23 devnull f->fid = fid;
784 7763a61a 2003-11-23 devnull f->next = fids;
785 7763a61a 2003-11-23 devnull fids = f;
786 7763a61a 2003-11-23 devnull return f;
787 7763a61a 2003-11-23 devnull }
788 7763a61a 2003-11-23 devnull
789 7763a61a 2003-11-23 devnull void
790 7763a61a 2003-11-23 devnull io(void)
791 7763a61a 2003-11-23 devnull {
792 7763a61a 2003-11-23 devnull char *err;
793 7763a61a 2003-11-23 devnull int n;
794 7763a61a 2003-11-23 devnull
795 7763a61a 2003-11-23 devnull for(;;){
796 be3e3514 2008-04-17 rsc n = read9pmsg(mfd[0], mdata, sizeof mdata);
797 be3e3514 2008-04-17 rsc if(n <= 0)
798 7763a61a 2003-11-23 devnull break;
799 bbfdd7a6 2005-09-13 devnull if(convM2Su(mdata, n, &rhdr, dotu) != n)
800 7763a61a 2003-11-23 devnull sysfatal("convM2S conversion error");
801 7763a61a 2003-11-23 devnull
802 7763a61a 2003-11-23 devnull if(dflag)
803 7763a61a 2003-11-23 devnull fprint(2, "vacfs:<-%F\n", &rhdr);
804 7763a61a 2003-11-23 devnull
805 7763a61a 2003-11-23 devnull thdr.data = (char*)mdata + IOHDRSZ;
806 7763a61a 2003-11-23 devnull if(!fcalls[rhdr.type])
807 7763a61a 2003-11-23 devnull err = "bad fcall type";
808 7763a61a 2003-11-23 devnull else
809 7763a61a 2003-11-23 devnull err = (*fcalls[rhdr.type])(newfid(rhdr.fid));
810 7763a61a 2003-11-23 devnull if(err){
811 7763a61a 2003-11-23 devnull thdr.type = Rerror;
812 7763a61a 2003-11-23 devnull thdr.ename = err;
813 ada3d479 2008-06-15 rsc #ifdef PLAN9PORT
814 bbfdd7a6 2005-09-13 devnull thdr.errornum = 0;
815 ada3d479 2008-06-15 rsc #endif
816 7763a61a 2003-11-23 devnull }else{
817 7763a61a 2003-11-23 devnull thdr.type = rhdr.type + 1;
818 7763a61a 2003-11-23 devnull thdr.fid = rhdr.fid;
819 7763a61a 2003-11-23 devnull }
820 7763a61a 2003-11-23 devnull thdr.tag = rhdr.tag;
821 7763a61a 2003-11-23 devnull if(dflag)
822 7763a61a 2003-11-23 devnull fprint(2, "vacfs:->%F\n", &thdr);
823 bbfdd7a6 2005-09-13 devnull n = convS2Mu(&thdr, mdata, messagesize, dotu);
824 9e2f1d9b 2005-11-21 devnull if(n <= BIT16SZ)
825 9e2f1d9b 2005-11-21 devnull sysfatal("convS2Mu conversion error");
826 9e2f1d9b 2005-11-21 devnull if(err)
827 a20a1468 2005-01-16 devnull vtfree(err);
828 a20a1468 2005-01-16 devnull
829 7763a61a 2003-11-23 devnull if(write(mfd[1], mdata, n) != n)
830 7763a61a 2003-11-23 devnull sysfatal("mount write: %r");
831 7763a61a 2003-11-23 devnull }
832 7763a61a 2003-11-23 devnull }
833 7763a61a 2003-11-23 devnull
834 7763a61a 2003-11-23 devnull int
835 7763a61a 2003-11-23 devnull permf(VacFile *vf, char *user, int p)
836 7763a61a 2003-11-23 devnull {
837 7763a61a 2003-11-23 devnull VacDir dir;
838 7763a61a 2003-11-23 devnull ulong perm;
839 7763a61a 2003-11-23 devnull
840 a20a1468 2005-01-16 devnull if(vacfilegetdir(vf, &dir))
841 7763a61a 2003-11-23 devnull return 0;
842 7763a61a 2003-11-23 devnull perm = dir.mode & 0777;
843 a20a1468 2005-01-16 devnull
844 7763a61a 2003-11-23 devnull if(noperm)
845 7763a61a 2003-11-23 devnull goto Good;
846 7763a61a 2003-11-23 devnull if((p*Pother) & perm)
847 7763a61a 2003-11-23 devnull goto Good;
848 7763a61a 2003-11-23 devnull if(strcmp(user, dir.gid)==0 && ((p*Pgroup) & perm))
849 7763a61a 2003-11-23 devnull goto Good;
850 7763a61a 2003-11-23 devnull if(strcmp(user, dir.uid)==0 && ((p*Powner) & perm))
851 7763a61a 2003-11-23 devnull goto Good;
852 a20a1468 2005-01-16 devnull vdcleanup(&dir);
853 7763a61a 2003-11-23 devnull return 0;
854 7763a61a 2003-11-23 devnull Good:
855 a20a1468 2005-01-16 devnull vdcleanup(&dir);
856 7763a61a 2003-11-23 devnull return 1;
857 7763a61a 2003-11-23 devnull }
858 7763a61a 2003-11-23 devnull
859 7763a61a 2003-11-23 devnull int
860 7763a61a 2003-11-23 devnull perm(Fid *f, int p)
861 7763a61a 2003-11-23 devnull {
862 7763a61a 2003-11-23 devnull return permf(f->file, f->user, p);
863 7763a61a 2003-11-23 devnull }
864 7763a61a 2003-11-23 devnull
865 7763a61a 2003-11-23 devnull void
866 a331ac4c 2005-01-19 devnull vacshutdown(void)
867 7763a61a 2003-11-23 devnull {
868 7763a61a 2003-11-23 devnull Fid *f;
869 7763a61a 2003-11-23 devnull
870 7763a61a 2003-11-23 devnull for(f = fids; f; f = f->next) {
871 7763a61a 2003-11-23 devnull if(!f->busy)
872 7763a61a 2003-11-23 devnull continue;
873 7763a61a 2003-11-23 devnull rclunk(f);
874 7763a61a 2003-11-23 devnull }
875 7763a61a 2003-11-23 devnull
876 a20a1468 2005-01-16 devnull vacfsclose(fs);
877 a20a1468 2005-01-16 devnull vthangup(conn);
878 7763a61a 2003-11-23 devnull }
879 7763a61a 2003-11-23 devnull