void Xattach(Fsrpc *t) { int i, nfd; Fcall rhdr; Fid *f; char buf[128]; f = newfid(t->work.fid); if(f == 0) { reply(&t->work, &rhdr, Ebadfid); t->busy = 0; return; } if(srvfd >= 0){ if(psmpt == 0){ Nomount: reply(&t->work, &rhdr, Enopsmt); t->busy = 0; freefid(t->work.fid); return; } for(i=0; i<Npsmpt; i++) if(psmap[i] == 0) break; if(i >= Npsmpt) goto Nomount; sprint(buf, "%d", i); f->f = file(psmpt, buf); if(f->f == nil) goto Nomount; sprint(buf, "/mnt/exportfs/%d", i); nfd = dup(srvfd, -1); if(amount(nfd, buf, MREPL|MCREATE, t->work.aname) < 0){ errstr(buf, sizeof buf); reply(&t->work, &rhdr, buf); t->busy = 0; freefid(t->work.fid); close(nfd); return; } psmap[i] = 1; f->mid = i; }else{ f->f = root; f->f->ref++; } rhdr.qid = f->f->qid; reply(&t->work, &rhdr, 0); t->busy = 0; }
char* rwalk(Job *job, Mfile *mf) { int i, nelems; char *err; char **elems; Mfile *nmf; Qid qid; err = 0; nmf = nil; elems = job->request.wname; nelems = job->request.nwname; job->reply.nwqid = 0; if(job->request.newfid != job->request.fid){ /* clone fid */ nmf = copyfid(mf, job->request.newfid); if(nmf == nil){ err = "clone bad newfid"; goto send; } mf = nmf; } /* else nmf will be nil */ qid = mf->qid; if(nelems > 0) /* walk fid */ for(i=0; i<nelems && i<MAXWELEM; i++){ if((qid.type & QTDIR) == 0){ err = "not a directory"; break; } if (strcmp(elems[i], "..") == 0 || strcmp(elems[i], ".") == 0){ qid.type = QTDIR; qid.path = Qdir; Found: job->reply.wqid[i] = qid; job->reply.nwqid++; continue; } if(strcmp(elems[i], "dns") == 0){ qid.type = QTFILE; qid.path = Qdns; goto Found; } err = "file does not exist"; break; } send: if(nmf != nil && (err!=nil || job->reply.nwqid<nelems)) freefid(nmf); if(err == nil) mf->qid = qid; sendmsg(job, err); return err; }
void rclunk(Job *job, Mfile *mf) { freefid(mf); sendmsg(job, 0); }