13e12c5d1SDavid du Colombier #include "all.h"
2*9a747e4fSDavid du Colombier #include "9p1.h"
33e12c5d1SDavid du Colombier
43e12c5d1SDavid du Colombier void
fcall9p1(Chan * cp,Oldfcall * in,Oldfcall * ou)5*9a747e4fSDavid du Colombier fcall9p1(Chan *cp, Oldfcall *in, Oldfcall *ou)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier int t;
83e12c5d1SDavid du Colombier
93e12c5d1SDavid du Colombier rlock(&mainlock);
103e12c5d1SDavid du Colombier t = in->type;
11*9a747e4fSDavid du Colombier if(t < 0 || t >= MAXSYSCALL || (t&1) || !call9p1[t]) {
123e12c5d1SDavid du Colombier print("bad message type %d\n", t);
133e12c5d1SDavid du Colombier panic("");
143e12c5d1SDavid du Colombier }
153e12c5d1SDavid du Colombier ou->type = t+1;
163e12c5d1SDavid du Colombier ou->err = 0;
173e12c5d1SDavid du Colombier
183e12c5d1SDavid du Colombier rlock(&cp->reflock);
19*9a747e4fSDavid du Colombier (*call9p1[t])(cp, in, ou);
203e12c5d1SDavid du Colombier runlock(&cp->reflock);
213e12c5d1SDavid du Colombier
22*9a747e4fSDavid du Colombier if(ou->err)
23*9a747e4fSDavid du Colombier if(CHAT(cp))
24*9a747e4fSDavid du Colombier print(" error: %s\n", errstring[ou->err]);
253e12c5d1SDavid du Colombier cons.work.count++;
263e12c5d1SDavid du Colombier runlock(&mainlock);
273e12c5d1SDavid du Colombier }
283e12c5d1SDavid du Colombier
293e12c5d1SDavid du Colombier int
con_session(void)303e12c5d1SDavid du Colombier con_session(void)
313e12c5d1SDavid du Colombier {
32*9a747e4fSDavid du Colombier Oldfcall in, ou;
333e12c5d1SDavid du Colombier
34*9a747e4fSDavid du Colombier in.type = Tsession9p1;
35*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
363e12c5d1SDavid du Colombier return ou.err;
373e12c5d1SDavid du Colombier }
383e12c5d1SDavid du Colombier
393e12c5d1SDavid du Colombier int
con_attach(int fid,char * uid,char * arg)403e12c5d1SDavid du Colombier con_attach(int fid, char *uid, char *arg)
413e12c5d1SDavid du Colombier {
42*9a747e4fSDavid du Colombier Oldfcall in, ou;
433e12c5d1SDavid du Colombier
44*9a747e4fSDavid du Colombier in.type = Tattach9p1;
453e12c5d1SDavid du Colombier in.fid = fid;
463e12c5d1SDavid du Colombier strncpy(in.uname, uid, NAMELEN);
473e12c5d1SDavid du Colombier strncpy(in.aname, arg, NAMELEN);
48*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
493e12c5d1SDavid du Colombier return ou.err;
503e12c5d1SDavid du Colombier }
513e12c5d1SDavid du Colombier
523e12c5d1SDavid du Colombier int
con_clone(int fid1,int fid2)533e12c5d1SDavid du Colombier con_clone(int fid1, int fid2)
543e12c5d1SDavid du Colombier {
55*9a747e4fSDavid du Colombier Oldfcall in, ou;
563e12c5d1SDavid du Colombier
57*9a747e4fSDavid du Colombier in.type = Tclone9p1;
583e12c5d1SDavid du Colombier in.fid = fid1;
593e12c5d1SDavid du Colombier in.newfid = fid2;
60*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
613e12c5d1SDavid du Colombier return ou.err;
623e12c5d1SDavid du Colombier }
633e12c5d1SDavid du Colombier
643e12c5d1SDavid du Colombier int
con_path(int fid,char * path)653e12c5d1SDavid du Colombier con_path(int fid, char *path)
663e12c5d1SDavid du Colombier {
67*9a747e4fSDavid du Colombier Oldfcall in, ou;
683e12c5d1SDavid du Colombier char *p;
693e12c5d1SDavid du Colombier
70*9a747e4fSDavid du Colombier in.type = Twalk9p1;
713e12c5d1SDavid du Colombier in.fid = fid;
723e12c5d1SDavid du Colombier
733e12c5d1SDavid du Colombier loop:
743e12c5d1SDavid du Colombier if(*path == 0)
753e12c5d1SDavid du Colombier return 0;
763e12c5d1SDavid du Colombier strncpy(in.name, path, NAMELEN);
773e12c5d1SDavid du Colombier if(p = strchr(path, '/')) {
783e12c5d1SDavid du Colombier path = p+1;
793e12c5d1SDavid du Colombier if(p = strchr(in.name, '/'))
803e12c5d1SDavid du Colombier *p = 0;
813e12c5d1SDavid du Colombier } else
823e12c5d1SDavid du Colombier path = strchr(path, 0);
833e12c5d1SDavid du Colombier if(in.name[0]) {
84*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
853e12c5d1SDavid du Colombier if(ou.err)
863e12c5d1SDavid du Colombier return ou.err;
873e12c5d1SDavid du Colombier }
883e12c5d1SDavid du Colombier goto loop;
893e12c5d1SDavid du Colombier }
903e12c5d1SDavid du Colombier
913e12c5d1SDavid du Colombier int
con_walk(int fid,char * name)923e12c5d1SDavid du Colombier con_walk(int fid, char *name)
933e12c5d1SDavid du Colombier {
94*9a747e4fSDavid du Colombier Oldfcall in, ou;
953e12c5d1SDavid du Colombier
96*9a747e4fSDavid du Colombier in.type = Twalk9p1;
973e12c5d1SDavid du Colombier in.fid = fid;
983e12c5d1SDavid du Colombier strncpy(in.name, name, NAMELEN);
99*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1003e12c5d1SDavid du Colombier return ou.err;
1013e12c5d1SDavid du Colombier }
1023e12c5d1SDavid du Colombier
1033e12c5d1SDavid du Colombier int
con_stat(int fid,char * data)1043e12c5d1SDavid du Colombier con_stat(int fid, char *data)
1053e12c5d1SDavid du Colombier {
106*9a747e4fSDavid du Colombier Oldfcall in, ou;
1073e12c5d1SDavid du Colombier
108*9a747e4fSDavid du Colombier in.type = Tstat9p1;
1093e12c5d1SDavid du Colombier in.fid = fid;
110*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1113e12c5d1SDavid du Colombier if(ou.err == 0)
112bd389b36SDavid du Colombier memmove(data, ou.stat, sizeof ou.stat);
1133e12c5d1SDavid du Colombier return ou.err;
1143e12c5d1SDavid du Colombier }
1153e12c5d1SDavid du Colombier
1163e12c5d1SDavid du Colombier int
con_wstat(int fid,char * data)1173e12c5d1SDavid du Colombier con_wstat(int fid, char *data)
1183e12c5d1SDavid du Colombier {
119*9a747e4fSDavid du Colombier Oldfcall in, ou;
1203e12c5d1SDavid du Colombier
121*9a747e4fSDavid du Colombier in.type = Twstat9p1;
1223e12c5d1SDavid du Colombier in.fid = fid;
123bd389b36SDavid du Colombier memmove(in.stat, data, sizeof in.stat);
124*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1253e12c5d1SDavid du Colombier return ou.err;
1263e12c5d1SDavid du Colombier }
1273e12c5d1SDavid du Colombier
1283e12c5d1SDavid du Colombier int
con_open(int fid,int mode)1293e12c5d1SDavid du Colombier con_open(int fid, int mode)
1303e12c5d1SDavid du Colombier {
131*9a747e4fSDavid du Colombier Oldfcall in, ou;
1323e12c5d1SDavid du Colombier
133*9a747e4fSDavid du Colombier in.type = Topen9p1;
1343e12c5d1SDavid du Colombier in.fid = fid;
1353e12c5d1SDavid du Colombier in.mode = mode;
136*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1373e12c5d1SDavid du Colombier return ou.err;
1383e12c5d1SDavid du Colombier }
1393e12c5d1SDavid du Colombier
1403e12c5d1SDavid du Colombier int
con_read(int fid,char * data,long offset,int count)1413e12c5d1SDavid du Colombier con_read(int fid, char *data, long offset, int count)
1423e12c5d1SDavid du Colombier {
143*9a747e4fSDavid du Colombier Oldfcall in, ou;
1443e12c5d1SDavid du Colombier
145*9a747e4fSDavid du Colombier in.type = Tread9p1;
1463e12c5d1SDavid du Colombier in.fid = fid;
1473e12c5d1SDavid du Colombier in.offset = offset;
1483e12c5d1SDavid du Colombier in.count = count;
1493e12c5d1SDavid du Colombier ou.data = data;
150*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1513e12c5d1SDavid du Colombier if(ou.err)
1523e12c5d1SDavid du Colombier return 0;
1533e12c5d1SDavid du Colombier return ou.count;
1543e12c5d1SDavid du Colombier }
1553e12c5d1SDavid du Colombier
1563e12c5d1SDavid du Colombier int
con_write(int fid,char * data,long offset,int count)1573e12c5d1SDavid du Colombier con_write(int fid, char *data, long offset, int count)
1583e12c5d1SDavid du Colombier {
159*9a747e4fSDavid du Colombier Oldfcall in, ou;
1603e12c5d1SDavid du Colombier
161*9a747e4fSDavid du Colombier in.type = Twrite9p1;
1623e12c5d1SDavid du Colombier in.fid = fid;
1633e12c5d1SDavid du Colombier in.data = data;
1643e12c5d1SDavid du Colombier in.offset = offset;
1653e12c5d1SDavid du Colombier in.count = count;
166*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1673e12c5d1SDavid du Colombier if(ou.err)
1683e12c5d1SDavid du Colombier return 0;
1693e12c5d1SDavid du Colombier return ou.count;
1703e12c5d1SDavid du Colombier }
1713e12c5d1SDavid du Colombier
1723e12c5d1SDavid du Colombier int
con_remove(int fid)1733e12c5d1SDavid du Colombier con_remove(int fid)
1743e12c5d1SDavid du Colombier {
175*9a747e4fSDavid du Colombier Oldfcall in, ou;
1763e12c5d1SDavid du Colombier
177*9a747e4fSDavid du Colombier in.type = Tremove9p1;
1783e12c5d1SDavid du Colombier in.fid = fid;
179*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1803e12c5d1SDavid du Colombier return ou.err;
1813e12c5d1SDavid du Colombier }
1823e12c5d1SDavid du Colombier
1833e12c5d1SDavid du Colombier int
con_create(int fid,char * name,int uid,int gid,long perm,int mode)1843e12c5d1SDavid du Colombier con_create(int fid, char *name, int uid, int gid, long perm, int mode)
1853e12c5d1SDavid du Colombier {
186*9a747e4fSDavid du Colombier Oldfcall in, ou;
1873e12c5d1SDavid du Colombier
188*9a747e4fSDavid du Colombier in.type = Tcreate9p1;
1893e12c5d1SDavid du Colombier in.fid = fid;
1903e12c5d1SDavid du Colombier strncpy(in.name, name, NAMELEN);
1913e12c5d1SDavid du Colombier in.perm = perm;
1923e12c5d1SDavid du Colombier in.mode = mode;
1933e12c5d1SDavid du Colombier cons.uid = uid; /* beyond ugly */
1943e12c5d1SDavid du Colombier cons.gid = gid;
195*9a747e4fSDavid du Colombier fcall9p1(cons.chan, &in, &ou);
1963e12c5d1SDavid du Colombier return ou.err;
1973e12c5d1SDavid du Colombier }
1983e12c5d1SDavid du Colombier
1993e12c5d1SDavid du Colombier int
doclri(File * f)2003e12c5d1SDavid du Colombier doclri(File *f)
2013e12c5d1SDavid du Colombier {
2023e12c5d1SDavid du Colombier Iobuf *p, *p1;
2033e12c5d1SDavid du Colombier Dentry *d, *d1;
2043e12c5d1SDavid du Colombier int err;
2053e12c5d1SDavid du Colombier
2063e12c5d1SDavid du Colombier err = 0;
2073e12c5d1SDavid du Colombier p = 0;
2083e12c5d1SDavid du Colombier p1 = 0;
2093e12c5d1SDavid du Colombier if(isro(f->fs->dev)) {
2103e12c5d1SDavid du Colombier err = Eronly;
2113e12c5d1SDavid du Colombier goto out;
2123e12c5d1SDavid du Colombier }
2133e12c5d1SDavid du Colombier /*
2143e12c5d1SDavid du Colombier * check on parent directory of file to be deleted
2153e12c5d1SDavid du Colombier */
2163e12c5d1SDavid du Colombier if(f->wpath == 0 || f->wpath->addr == f->addr) {
2173e12c5d1SDavid du Colombier err = Ephase;
2183e12c5d1SDavid du Colombier goto out;
2193e12c5d1SDavid du Colombier }
2203e12c5d1SDavid du Colombier p1 = getbuf(f->fs->dev, f->wpath->addr, Bread);
2213e12c5d1SDavid du Colombier d1 = getdir(p1, f->wpath->slot);
2223e12c5d1SDavid du Colombier if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) {
2233e12c5d1SDavid du Colombier err = Ephase;
2243e12c5d1SDavid du Colombier goto out;
2253e12c5d1SDavid du Colombier }
2263e12c5d1SDavid du Colombier
2273e12c5d1SDavid du Colombier accessdir(p1, d1, FWRITE);
2283e12c5d1SDavid du Colombier putbuf(p1);
2293e12c5d1SDavid du Colombier p1 = 0;
2303e12c5d1SDavid du Colombier
2313e12c5d1SDavid du Colombier /*
2323e12c5d1SDavid du Colombier * check on file to be deleted
2333e12c5d1SDavid du Colombier */
2343e12c5d1SDavid du Colombier p = getbuf(f->fs->dev, f->addr, Bread);
2353e12c5d1SDavid du Colombier d = getdir(p, f->slot);
2363e12c5d1SDavid du Colombier
2373e12c5d1SDavid du Colombier
2383e12c5d1SDavid du Colombier /*
2393e12c5d1SDavid du Colombier * do it
2403e12c5d1SDavid du Colombier */
2413e12c5d1SDavid du Colombier memset(d, 0, sizeof(Dentry));
2423e12c5d1SDavid du Colombier settag(p, Tdir, QPNONE);
2433e12c5d1SDavid du Colombier freewp(f->wpath);
2443e12c5d1SDavid du Colombier freefp(f);
2453e12c5d1SDavid du Colombier
2463e12c5d1SDavid du Colombier out:
2473e12c5d1SDavid du Colombier if(p1)
2483e12c5d1SDavid du Colombier putbuf(p1);
2493e12c5d1SDavid du Colombier if(p)
2503e12c5d1SDavid du Colombier putbuf(p);
2513e12c5d1SDavid du Colombier return err;
2523e12c5d1SDavid du Colombier }
2533e12c5d1SDavid du Colombier
2543e12c5d1SDavid du Colombier void
f_clri(Chan * cp,Oldfcall * in,Oldfcall * ou)255*9a747e4fSDavid du Colombier f_clri(Chan *cp, Oldfcall *in, Oldfcall *ou)
2563e12c5d1SDavid du Colombier {
2573e12c5d1SDavid du Colombier File *f;
2583e12c5d1SDavid du Colombier
2593e12c5d1SDavid du Colombier if(CHAT(cp)) {
2603e12c5d1SDavid du Colombier print("c_clri %d\n", cp->chan);
2613e12c5d1SDavid du Colombier print(" fid = %d\n", in->fid);
2623e12c5d1SDavid du Colombier }
2633e12c5d1SDavid du Colombier
2643e12c5d1SDavid du Colombier f = filep(cp, in->fid, 0);
2653e12c5d1SDavid du Colombier if(!f) {
2663e12c5d1SDavid du Colombier ou->err = Efid;
2673e12c5d1SDavid du Colombier goto out;
2683e12c5d1SDavid du Colombier }
2693e12c5d1SDavid du Colombier ou->err = doclri(f);
2703e12c5d1SDavid du Colombier
2713e12c5d1SDavid du Colombier out:
2723e12c5d1SDavid du Colombier ou->fid = in->fid;
2733e12c5d1SDavid du Colombier if(f)
2743e12c5d1SDavid du Colombier qunlock(f);
2753e12c5d1SDavid du Colombier }
2763e12c5d1SDavid du Colombier
2773e12c5d1SDavid du Colombier int
con_clri(int fid)2783e12c5d1SDavid du Colombier con_clri(int fid)
2793e12c5d1SDavid du Colombier {
280*9a747e4fSDavid du Colombier Oldfcall in, ou;
2813e12c5d1SDavid du Colombier Chan *cp;
2823e12c5d1SDavid du Colombier
283*9a747e4fSDavid du Colombier in.type = Tremove9p1;
2843e12c5d1SDavid du Colombier in.fid = fid;
2853e12c5d1SDavid du Colombier cp = cons.chan;
2863e12c5d1SDavid du Colombier
2873e12c5d1SDavid du Colombier rlock(&mainlock);
288*9a747e4fSDavid du Colombier ou.type = Tremove9p1+1;
2893e12c5d1SDavid du Colombier ou.err = 0;
2903e12c5d1SDavid du Colombier
2913e12c5d1SDavid du Colombier rlock(&cp->reflock);
2923e12c5d1SDavid du Colombier
2933e12c5d1SDavid du Colombier f_clri(cp, &in, &ou);
2943e12c5d1SDavid du Colombier
2953e12c5d1SDavid du Colombier runlock(&cp->reflock);
2963e12c5d1SDavid du Colombier
2973e12c5d1SDavid du Colombier cons.work.count++;
2983e12c5d1SDavid du Colombier runlock(&mainlock);
2993e12c5d1SDavid du Colombier return ou.err;
3003e12c5d1SDavid du Colombier }
301*9a747e4fSDavid du Colombier
302*9a747e4fSDavid du Colombier int
con_swap(int fid1,int fid2)303*9a747e4fSDavid du Colombier con_swap(int fid1, int fid2)
304*9a747e4fSDavid du Colombier {
305*9a747e4fSDavid du Colombier int err;
306*9a747e4fSDavid du Colombier Iobuf *p1, *p2;
307*9a747e4fSDavid du Colombier File *f1, *f2;
308*9a747e4fSDavid du Colombier Dentry *d1, *d2;
309*9a747e4fSDavid du Colombier Dentry dt1, dt2;
310*9a747e4fSDavid du Colombier Chan *cp;
311*9a747e4fSDavid du Colombier
312*9a747e4fSDavid du Colombier cp = cons.chan;
313*9a747e4fSDavid du Colombier err = 0;
314*9a747e4fSDavid du Colombier rlock(&mainlock);
315*9a747e4fSDavid du Colombier rlock(&cp->reflock);
316*9a747e4fSDavid du Colombier
317*9a747e4fSDavid du Colombier f2 = nil;
318*9a747e4fSDavid du Colombier p1 = p2 = nil;
319*9a747e4fSDavid du Colombier f1 = filep(cp, fid1, 0);
320*9a747e4fSDavid du Colombier if(!f1){
321*9a747e4fSDavid du Colombier err = Efid;
322*9a747e4fSDavid du Colombier goto out;
323*9a747e4fSDavid du Colombier }
324*9a747e4fSDavid du Colombier p1 = getbuf(f1->fs->dev, f1->addr, Bread|Bmod);
325*9a747e4fSDavid du Colombier d1 = getdir(p1, f1->slot);
326*9a747e4fSDavid du Colombier if(!d1 || !(d1->mode&DALLOC)){
327*9a747e4fSDavid du Colombier err = Ealloc;
328*9a747e4fSDavid du Colombier goto out;
329*9a747e4fSDavid du Colombier }
330*9a747e4fSDavid du Colombier
331*9a747e4fSDavid du Colombier f2 = filep(cp, fid2, 0);
332*9a747e4fSDavid du Colombier if(!f2){
333*9a747e4fSDavid du Colombier err = Efid;
334*9a747e4fSDavid du Colombier goto out;
335*9a747e4fSDavid du Colombier }
336*9a747e4fSDavid du Colombier if(memcmp(&f1->fs->dev, &f2->fs->dev, 4)==0
337*9a747e4fSDavid du Colombier && f2->addr == f1->addr)
338*9a747e4fSDavid du Colombier p2 = p1;
339*9a747e4fSDavid du Colombier else
340*9a747e4fSDavid du Colombier p2 = getbuf(f2->fs->dev, f2->addr, Bread|Bmod);
341*9a747e4fSDavid du Colombier d2 = getdir(p2, f2->slot);
342*9a747e4fSDavid du Colombier if(!d2 || !(d2->mode&DALLOC)){
343*9a747e4fSDavid du Colombier err = Ealloc;
344*9a747e4fSDavid du Colombier goto out;
345*9a747e4fSDavid du Colombier }
346*9a747e4fSDavid du Colombier
347*9a747e4fSDavid du Colombier dt1 = *d1;
348*9a747e4fSDavid du Colombier dt2 = *d2;
349*9a747e4fSDavid du Colombier *d1 = dt2;
350*9a747e4fSDavid du Colombier *d2 = dt1;
351*9a747e4fSDavid du Colombier memmove(d1->name, dt1.name, NAMELEN);
352*9a747e4fSDavid du Colombier memmove(d2->name, dt2.name, NAMELEN);
353*9a747e4fSDavid du Colombier
354*9a747e4fSDavid du Colombier mkqid(&f1->qid, d1, 1);
355*9a747e4fSDavid du Colombier mkqid(&f2->qid, d2, 1);
356*9a747e4fSDavid du Colombier out:
357*9a747e4fSDavid du Colombier if(f1)
358*9a747e4fSDavid du Colombier qunlock(f1);
359*9a747e4fSDavid du Colombier if(f2)
360*9a747e4fSDavid du Colombier qunlock(f2);
361*9a747e4fSDavid du Colombier if(p1)
362*9a747e4fSDavid du Colombier putbuf(p1);
363*9a747e4fSDavid du Colombier if(p2 && p2!=p1)
364*9a747e4fSDavid du Colombier putbuf(p2);
365*9a747e4fSDavid du Colombier
366*9a747e4fSDavid du Colombier runlock(&cp->reflock);
367*9a747e4fSDavid du Colombier cons.work.count++;
368*9a747e4fSDavid du Colombier runlock(&mainlock);
369*9a747e4fSDavid du Colombier
370*9a747e4fSDavid du Colombier return err;
371*9a747e4fSDavid du Colombier }
372