1*3e12c5d1SDavid du Colombier #include "all.h" 2*3e12c5d1SDavid du Colombier 3*3e12c5d1SDavid du Colombier void 4*3e12c5d1SDavid du Colombier p9fcall(Chan *cp, Fcall *in, Fcall *ou) 5*3e12c5d1SDavid du Colombier { 6*3e12c5d1SDavid du Colombier int t; 7*3e12c5d1SDavid du Colombier 8*3e12c5d1SDavid du Colombier rlock(&mainlock); 9*3e12c5d1SDavid du Colombier t = in->type; 10*3e12c5d1SDavid du Colombier if(t < 0 || t >= MAXSYSCALL || (t&1) || !p9call[t]) { 11*3e12c5d1SDavid du Colombier print("bad message type %d\n", t); 12*3e12c5d1SDavid du Colombier panic(""); 13*3e12c5d1SDavid du Colombier } 14*3e12c5d1SDavid du Colombier ou->type = t+1; 15*3e12c5d1SDavid du Colombier ou->err = 0; 16*3e12c5d1SDavid du Colombier 17*3e12c5d1SDavid du Colombier rlock(&cp->reflock); 18*3e12c5d1SDavid du Colombier 19*3e12c5d1SDavid du Colombier (*p9call[t])(cp, in, ou); 20*3e12c5d1SDavid du Colombier 21*3e12c5d1SDavid du Colombier runlock(&cp->reflock); 22*3e12c5d1SDavid du Colombier 23*3e12c5d1SDavid du Colombier cons.work.count++; 24*3e12c5d1SDavid du Colombier runlock(&mainlock); 25*3e12c5d1SDavid du Colombier } 26*3e12c5d1SDavid du Colombier 27*3e12c5d1SDavid du Colombier int 28*3e12c5d1SDavid du Colombier con_session(void) 29*3e12c5d1SDavid du Colombier { 30*3e12c5d1SDavid du Colombier Fcall in, ou; 31*3e12c5d1SDavid du Colombier 32*3e12c5d1SDavid du Colombier in.type = Tsession; 33*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 34*3e12c5d1SDavid du Colombier return ou.err; 35*3e12c5d1SDavid du Colombier } 36*3e12c5d1SDavid du Colombier 37*3e12c5d1SDavid du Colombier int 38*3e12c5d1SDavid du Colombier con_attach(int fid, char *uid, char *arg) 39*3e12c5d1SDavid du Colombier { 40*3e12c5d1SDavid du Colombier Fcall in, ou; 41*3e12c5d1SDavid du Colombier 42*3e12c5d1SDavid du Colombier in.type = Tattach; 43*3e12c5d1SDavid du Colombier in.fid = fid; 44*3e12c5d1SDavid du Colombier strncpy(in.uname, uid, NAMELEN); 45*3e12c5d1SDavid du Colombier strncpy(in.aname, arg, NAMELEN); 46*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 47*3e12c5d1SDavid du Colombier return ou.err; 48*3e12c5d1SDavid du Colombier } 49*3e12c5d1SDavid du Colombier 50*3e12c5d1SDavid du Colombier int 51*3e12c5d1SDavid du Colombier con_clone(int fid1, int fid2) 52*3e12c5d1SDavid du Colombier { 53*3e12c5d1SDavid du Colombier Fcall in, ou; 54*3e12c5d1SDavid du Colombier 55*3e12c5d1SDavid du Colombier in.type = Tclone; 56*3e12c5d1SDavid du Colombier in.fid = fid1; 57*3e12c5d1SDavid du Colombier in.newfid = fid2; 58*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 59*3e12c5d1SDavid du Colombier return ou.err; 60*3e12c5d1SDavid du Colombier } 61*3e12c5d1SDavid du Colombier 62*3e12c5d1SDavid du Colombier int 63*3e12c5d1SDavid du Colombier con_path(int fid, char *path) 64*3e12c5d1SDavid du Colombier { 65*3e12c5d1SDavid du Colombier Fcall in, ou; 66*3e12c5d1SDavid du Colombier char *p; 67*3e12c5d1SDavid du Colombier 68*3e12c5d1SDavid du Colombier in.type = Twalk; 69*3e12c5d1SDavid du Colombier in.fid = fid; 70*3e12c5d1SDavid du Colombier 71*3e12c5d1SDavid du Colombier loop: 72*3e12c5d1SDavid du Colombier if(*path == 0) 73*3e12c5d1SDavid du Colombier return 0; 74*3e12c5d1SDavid du Colombier strncpy(in.name, path, NAMELEN); 75*3e12c5d1SDavid du Colombier if(p = strchr(path, '/')) { 76*3e12c5d1SDavid du Colombier path = p+1; 77*3e12c5d1SDavid du Colombier if(p = strchr(in.name, '/')) 78*3e12c5d1SDavid du Colombier *p = 0; 79*3e12c5d1SDavid du Colombier } else 80*3e12c5d1SDavid du Colombier path = strchr(path, 0); 81*3e12c5d1SDavid du Colombier if(in.name[0]) { 82*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 83*3e12c5d1SDavid du Colombier if(ou.err) 84*3e12c5d1SDavid du Colombier return ou.err; 85*3e12c5d1SDavid du Colombier } 86*3e12c5d1SDavid du Colombier goto loop; 87*3e12c5d1SDavid du Colombier } 88*3e12c5d1SDavid du Colombier 89*3e12c5d1SDavid du Colombier int 90*3e12c5d1SDavid du Colombier con_walk(int fid, char *name) 91*3e12c5d1SDavid du Colombier { 92*3e12c5d1SDavid du Colombier Fcall in, ou; 93*3e12c5d1SDavid du Colombier 94*3e12c5d1SDavid du Colombier in.type = Twalk; 95*3e12c5d1SDavid du Colombier in.fid = fid; 96*3e12c5d1SDavid du Colombier strncpy(in.name, name, NAMELEN); 97*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 98*3e12c5d1SDavid du Colombier return ou.err; 99*3e12c5d1SDavid du Colombier } 100*3e12c5d1SDavid du Colombier 101*3e12c5d1SDavid du Colombier int 102*3e12c5d1SDavid du Colombier con_stat(int fid, char *data) 103*3e12c5d1SDavid du Colombier { 104*3e12c5d1SDavid du Colombier Fcall in, ou; 105*3e12c5d1SDavid du Colombier 106*3e12c5d1SDavid du Colombier in.type = Tstat; 107*3e12c5d1SDavid du Colombier in.fid = fid; 108*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 109*3e12c5d1SDavid du Colombier if(ou.err == 0) 110*3e12c5d1SDavid du Colombier memcpy(data, ou.stat, sizeof ou.stat); 111*3e12c5d1SDavid du Colombier return ou.err; 112*3e12c5d1SDavid du Colombier } 113*3e12c5d1SDavid du Colombier 114*3e12c5d1SDavid du Colombier int 115*3e12c5d1SDavid du Colombier con_wstat(int fid, char *data) 116*3e12c5d1SDavid du Colombier { 117*3e12c5d1SDavid du Colombier Fcall in, ou; 118*3e12c5d1SDavid du Colombier 119*3e12c5d1SDavid du Colombier in.type = Twstat; 120*3e12c5d1SDavid du Colombier in.fid = fid; 121*3e12c5d1SDavid du Colombier memcpy(in.stat, data, sizeof in.stat); 122*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 123*3e12c5d1SDavid du Colombier return ou.err; 124*3e12c5d1SDavid du Colombier } 125*3e12c5d1SDavid du Colombier 126*3e12c5d1SDavid du Colombier int 127*3e12c5d1SDavid du Colombier con_open(int fid, int mode) 128*3e12c5d1SDavid du Colombier { 129*3e12c5d1SDavid du Colombier Fcall in, ou; 130*3e12c5d1SDavid du Colombier 131*3e12c5d1SDavid du Colombier in.type = Topen; 132*3e12c5d1SDavid du Colombier in.fid = fid; 133*3e12c5d1SDavid du Colombier in.mode = mode; 134*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 135*3e12c5d1SDavid du Colombier return ou.err; 136*3e12c5d1SDavid du Colombier } 137*3e12c5d1SDavid du Colombier 138*3e12c5d1SDavid du Colombier int 139*3e12c5d1SDavid du Colombier con_read(int fid, char *data, long offset, int count) 140*3e12c5d1SDavid du Colombier { 141*3e12c5d1SDavid du Colombier Fcall in, ou; 142*3e12c5d1SDavid du Colombier 143*3e12c5d1SDavid du Colombier in.type = Tread; 144*3e12c5d1SDavid du Colombier in.fid = fid; 145*3e12c5d1SDavid du Colombier in.offset = offset; 146*3e12c5d1SDavid du Colombier in.count = count; 147*3e12c5d1SDavid du Colombier ou.data = data; 148*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 149*3e12c5d1SDavid du Colombier if(ou.err) 150*3e12c5d1SDavid du Colombier return 0; 151*3e12c5d1SDavid du Colombier return ou.count; 152*3e12c5d1SDavid du Colombier } 153*3e12c5d1SDavid du Colombier 154*3e12c5d1SDavid du Colombier int 155*3e12c5d1SDavid du Colombier con_write(int fid, char *data, long offset, int count) 156*3e12c5d1SDavid du Colombier { 157*3e12c5d1SDavid du Colombier Fcall in, ou; 158*3e12c5d1SDavid du Colombier 159*3e12c5d1SDavid du Colombier in.type = Twrite; 160*3e12c5d1SDavid du Colombier in.fid = fid; 161*3e12c5d1SDavid du Colombier in.data = data; 162*3e12c5d1SDavid du Colombier in.offset = offset; 163*3e12c5d1SDavid du Colombier in.count = count; 164*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 165*3e12c5d1SDavid du Colombier if(ou.err) 166*3e12c5d1SDavid du Colombier return 0; 167*3e12c5d1SDavid du Colombier return ou.count; 168*3e12c5d1SDavid du Colombier } 169*3e12c5d1SDavid du Colombier 170*3e12c5d1SDavid du Colombier int 171*3e12c5d1SDavid du Colombier con_remove(int fid) 172*3e12c5d1SDavid du Colombier { 173*3e12c5d1SDavid du Colombier Fcall in, ou; 174*3e12c5d1SDavid du Colombier 175*3e12c5d1SDavid du Colombier in.type = Tremove; 176*3e12c5d1SDavid du Colombier in.fid = fid; 177*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 178*3e12c5d1SDavid du Colombier return ou.err; 179*3e12c5d1SDavid du Colombier } 180*3e12c5d1SDavid du Colombier 181*3e12c5d1SDavid du Colombier int 182*3e12c5d1SDavid du Colombier con_create(int fid, char *name, int uid, int gid, long perm, int mode) 183*3e12c5d1SDavid du Colombier { 184*3e12c5d1SDavid du Colombier Fcall in, ou; 185*3e12c5d1SDavid du Colombier 186*3e12c5d1SDavid du Colombier in.type = Tcreate; 187*3e12c5d1SDavid du Colombier in.fid = fid; 188*3e12c5d1SDavid du Colombier strncpy(in.name, name, NAMELEN); 189*3e12c5d1SDavid du Colombier in.perm = perm; 190*3e12c5d1SDavid du Colombier in.mode = mode; 191*3e12c5d1SDavid du Colombier cons.uid = uid; /* beyond ugly */ 192*3e12c5d1SDavid du Colombier cons.gid = gid; 193*3e12c5d1SDavid du Colombier p9fcall(cons.chan, &in, &ou); 194*3e12c5d1SDavid du Colombier return ou.err; 195*3e12c5d1SDavid du Colombier } 196*3e12c5d1SDavid du Colombier 197*3e12c5d1SDavid du Colombier int 198*3e12c5d1SDavid du Colombier doclri(File *f) 199*3e12c5d1SDavid du Colombier { 200*3e12c5d1SDavid du Colombier Iobuf *p, *p1; 201*3e12c5d1SDavid du Colombier Dentry *d, *d1; 202*3e12c5d1SDavid du Colombier int err; 203*3e12c5d1SDavid du Colombier 204*3e12c5d1SDavid du Colombier err = 0; 205*3e12c5d1SDavid du Colombier p = 0; 206*3e12c5d1SDavid du Colombier p1 = 0; 207*3e12c5d1SDavid du Colombier if(isro(f->fs->dev)) { 208*3e12c5d1SDavid du Colombier err = Eronly; 209*3e12c5d1SDavid du Colombier goto out; 210*3e12c5d1SDavid du Colombier } 211*3e12c5d1SDavid du Colombier /* 212*3e12c5d1SDavid du Colombier * check on parent directory of file to be deleted 213*3e12c5d1SDavid du Colombier */ 214*3e12c5d1SDavid du Colombier if(f->wpath == 0 || f->wpath->addr == f->addr) { 215*3e12c5d1SDavid du Colombier err = Ephase; 216*3e12c5d1SDavid du Colombier goto out; 217*3e12c5d1SDavid du Colombier } 218*3e12c5d1SDavid du Colombier p1 = getbuf(f->fs->dev, f->wpath->addr, Bread); 219*3e12c5d1SDavid du Colombier d1 = getdir(p1, f->wpath->slot); 220*3e12c5d1SDavid du Colombier if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) { 221*3e12c5d1SDavid du Colombier err = Ephase; 222*3e12c5d1SDavid du Colombier goto out; 223*3e12c5d1SDavid du Colombier } 224*3e12c5d1SDavid du Colombier 225*3e12c5d1SDavid du Colombier accessdir(p1, d1, FWRITE); 226*3e12c5d1SDavid du Colombier putbuf(p1); 227*3e12c5d1SDavid du Colombier p1 = 0; 228*3e12c5d1SDavid du Colombier 229*3e12c5d1SDavid du Colombier /* 230*3e12c5d1SDavid du Colombier * check on file to be deleted 231*3e12c5d1SDavid du Colombier */ 232*3e12c5d1SDavid du Colombier p = getbuf(f->fs->dev, f->addr, Bread); 233*3e12c5d1SDavid du Colombier d = getdir(p, f->slot); 234*3e12c5d1SDavid du Colombier 235*3e12c5d1SDavid du Colombier 236*3e12c5d1SDavid du Colombier /* 237*3e12c5d1SDavid du Colombier * do it 238*3e12c5d1SDavid du Colombier */ 239*3e12c5d1SDavid du Colombier memset(d, 0, sizeof(Dentry)); 240*3e12c5d1SDavid du Colombier settag(p, Tdir, QPNONE); 241*3e12c5d1SDavid du Colombier freewp(f->wpath); 242*3e12c5d1SDavid du Colombier freefp(f); 243*3e12c5d1SDavid du Colombier 244*3e12c5d1SDavid du Colombier out: 245*3e12c5d1SDavid du Colombier if(p1) 246*3e12c5d1SDavid du Colombier putbuf(p1); 247*3e12c5d1SDavid du Colombier if(p) 248*3e12c5d1SDavid du Colombier putbuf(p); 249*3e12c5d1SDavid du Colombier return err; 250*3e12c5d1SDavid du Colombier } 251*3e12c5d1SDavid du Colombier 252*3e12c5d1SDavid du Colombier void 253*3e12c5d1SDavid du Colombier f_clri(Chan *cp, Fcall *in, Fcall *ou) 254*3e12c5d1SDavid du Colombier { 255*3e12c5d1SDavid du Colombier File *f; 256*3e12c5d1SDavid du Colombier 257*3e12c5d1SDavid du Colombier if(CHAT(cp)) { 258*3e12c5d1SDavid du Colombier print("c_clri %d\n", cp->chan); 259*3e12c5d1SDavid du Colombier print(" fid = %d\n", in->fid); 260*3e12c5d1SDavid du Colombier } 261*3e12c5d1SDavid du Colombier 262*3e12c5d1SDavid du Colombier f = filep(cp, in->fid, 0); 263*3e12c5d1SDavid du Colombier if(!f) { 264*3e12c5d1SDavid du Colombier ou->err = Efid; 265*3e12c5d1SDavid du Colombier goto out; 266*3e12c5d1SDavid du Colombier } 267*3e12c5d1SDavid du Colombier ou->err = doclri(f); 268*3e12c5d1SDavid du Colombier 269*3e12c5d1SDavid du Colombier out: 270*3e12c5d1SDavid du Colombier ou->fid = in->fid; 271*3e12c5d1SDavid du Colombier if(f) 272*3e12c5d1SDavid du Colombier qunlock(f); 273*3e12c5d1SDavid du Colombier } 274*3e12c5d1SDavid du Colombier 275*3e12c5d1SDavid du Colombier int 276*3e12c5d1SDavid du Colombier con_clri(int fid) 277*3e12c5d1SDavid du Colombier { 278*3e12c5d1SDavid du Colombier Fcall in, ou; 279*3e12c5d1SDavid du Colombier Chan *cp; 280*3e12c5d1SDavid du Colombier 281*3e12c5d1SDavid du Colombier in.type = Tremove; 282*3e12c5d1SDavid du Colombier in.fid = fid; 283*3e12c5d1SDavid du Colombier cp = cons.chan; 284*3e12c5d1SDavid du Colombier 285*3e12c5d1SDavid du Colombier rlock(&mainlock); 286*3e12c5d1SDavid du Colombier ou.type = Tremove+1; 287*3e12c5d1SDavid du Colombier ou.err = 0; 288*3e12c5d1SDavid du Colombier 289*3e12c5d1SDavid du Colombier rlock(&cp->reflock); 290*3e12c5d1SDavid du Colombier 291*3e12c5d1SDavid du Colombier f_clri(cp, &in, &ou); 292*3e12c5d1SDavid du Colombier 293*3e12c5d1SDavid du Colombier runlock(&cp->reflock); 294*3e12c5d1SDavid du Colombier 295*3e12c5d1SDavid du Colombier cons.work.count++; 296*3e12c5d1SDavid du Colombier runlock(&mainlock); 297*3e12c5d1SDavid du Colombier return ou.err; 298*3e12c5d1SDavid du Colombier } 299