static int remov(int n, Rpccall *cmd, Rpccall *reply) { Session *s; Xfile *xp; Xfid *xf, *newxf; String elem; Fid *nfid; uchar *argptr = cmd->args; uchar *dataptr = reply->results; if(n <= FHSIZE) return garbage(reply, "count too small"); xf = rpc2xfid(cmd, 0); argptr += FHSIZE; argptr += string2S(argptr, &elem); if(argptr != &((uchar *)cmd->args)[n]) return garbage(reply, "bad count"); if(xf == 0) return error(reply, NFSERR_STALE); xp = xf->xp; if(!(xp->qid.type & QTDIR)) return error(reply, NFSERR_NOTDIR); chat("%s/%.*s...", xp->name, utfnlen(elem.s, elem.n), elem.s); if(xp->s->noauth == 0 && xp->parent == xp && elem.s[0] == '#') return error(reply, NFSERR_PERM); newxf = xfwalkcr(Twalk, xf, &elem, 0); if(newxf == 0) return error(reply, NFSERR_NOENT); s = xp->s; nfid = newfid(s); setfid(s, newxf->urfid); s->f.newfid = nfid - s->fids; s->f.nwname = 0; if(xmesg(s, Twalk) < 0){ putfid(s, nfid); return error(reply, NFSERR_IO); } s->f.fid = nfid - s->fids; if(xmesg(s, Tremove) < 0){ putfid(s, nfid); return error(reply, NFSERR_PERM); } putfid(s, nfid); xpclear(newxf->xp); PLONG(NFS_OK); chat("OK\n"); return dataptr - (uchar *)reply->results; }
int clunkfid(Session *s, Fid *f) { putfid(s, f); if(s == 0 || f == 0) return 0; s->f.fid = f - s->fids; return xmesg(s, Tclunk); }
/* returns 0 if auth succeeded (or unneeded), -1 otherwise */ int authhostowner(Session *s) { Fid *af, *f; int rv = -1; int afd; AuthInfo *ai; AuthRpc *rpc; /* get a fid to authenticate over */ f = nil; af = newfid(s); s->f.afid = af - s->fids; s->f.uname = getuser(); s->f.aname = s->spec; if(xmesg(s, Tauth)){ /* not needed */ rv = 0; goto out; } quotefmtinstall(); /* just in case */ afd = open("/mnt/factotum/rpc", ORDWR); if(afd < 0){ werrstr("opening /mnt/factotum/rpc: %r"); goto out; } rpc = auth_allocrpc(afd); if(rpc == nil) goto out; ai = authproto(s, af, rpc, auth_getkey, "proto=p9any role=client"); if(ai != nil){ rv = 0; auth_freeAI(ai); } auth_freerpc(rpc); close(afd); /* try attaching with the afid */ chat("attaching as hostowner..."); f = newfid(s); s->f.fid = f - s->fids; s->f.afid = af - s->fids;; s->f.uname = getuser(); s->f.aname = s->spec; if(xmesg(s, Tattach) == 0) rv = 0; out: if(af != nil){ putfid(s, af); s->f.fid = af - s->fids; xmesg(s, Tclunk); } if(f != nil){ putfid(s, f); s->f.fid = f - s->fids; xmesg(s, Tclunk); } return rv; }