static void
rauth(Req *r, char *error)
{
- if(error && r->afid)
+ if(r->afid == nil)
+ return;
+ if(error){
closefid(removefid(r->srv->fpool, r->afid->fid));
+ return;
+ }
+ if(r->afid->omode == -1)
+ r->afid->omode = ORDWR;
}
static void
r->ofcall.qid = r->fid->qid;
switch(r->ifcall.mode&3){
default:
- assert(0);
+ respond(r, Ebotch);
+ return;
case OREAD:
p = AREAD;
break;
else
respond(r, nil);
}
-static void
-ropen(Req *r, char *error)
-{
- char errbuf[ERRMAX];
- if(error)
- return;
- if(chatty9p){
- snprint(errbuf, sizeof errbuf, "fid mode is 0x%ux\n", r->ifcall.mode);
- write(2, errbuf, strlen(errbuf));
- }
- r->fid->omode = r->ifcall.mode;
- r->fid->qid = r->ofcall.qid;
- if(r->ofcall.qid.type&QTDIR)
- r->fid->diroffset = 0;
-}
static void
screate(Srv *srv, Req *r)
else
respond(r, Enocreate);
}
+
static void
-rcreate(Req *r, char *error)
+ropen(Req *r, char *error)
{
if(error)
return;
- r->fid->omode = r->ifcall.mode;
+ if(chatty9p)
+ fprint(2, "fid mode is %x\n", (int)r->ifcall.mode);
+ if(r->ofcall.qid.type&QTDIR)
+ r->fid->diroffset = 0;
r->fid->qid = r->ofcall.qid;
+ r->fid->omode = r->ifcall.mode;
}
static void
respond(r, Eunknownfid);
return;
}
+ o = r->fid->omode;
+ if(o == -1){
+ respond(r, Ebotch);
+ return;
+ }
+ switch(o & 3){
+ default:
+ respond(r, Ebotch);
+ return;
+ case OREAD:
+ case ORDWR:
+ case OEXEC:
+ break;
+ }
if((int)r->ifcall.count < 0){
respond(r, Ebotch);
return;
respond(r, Ebadoffset);
return;
}
-
if(r->ifcall.count > srv->msize - IOHDRSZ)
r->ifcall.count = srv->msize - IOHDRSZ;
r->rbuf = emalloc9p(r->ifcall.count);
r->ofcall.data = r->rbuf;
- o = r->fid->omode & 3;
- if(o != OREAD && o != ORDWR && o != OEXEC){
- respond(r, Ebotch);
- return;
- }
if((r->fid->qid.type&QTDIR) && r->fid->file){
r->ofcall.count = readdirfile(r->fid->rdir, r->rbuf, r->ifcall.count, r->ifcall.offset);
respond(r, nil);
swrite(Srv *srv, Req *r)
{
int o;
- char e[ERRMAX];
if((r->fid = lookupfid(srv->fpool, r->ifcall.fid)) == nil){
respond(r, Eunknownfid);
return;
}
+ o = r->fid->omode;
+ if(o == -1){
+ respond(r, Ebotch);
+ return;
+ }
+ switch(o & 3){
+ default:
+ respond(r, Ebotch);
+ return;
+ case OWRITE:
+ case ORDWR:
+ break;
+ }
+ if(r->fid->qid.type&QTDIR){
+ respond(r, Ebotch);
+ return;
+ }
if((int)r->ifcall.count < 0){
respond(r, Ebotch);
return;
}
if(r->ifcall.count > srv->msize - IOHDRSZ)
r->ifcall.count = srv->msize - IOHDRSZ;
- o = r->fid->omode & 3;
- if(o != OWRITE && o != ORDWR){
- snprint(e, sizeof e, "write on fid with open mode 0x%ux", r->fid->omode);
- respond(r, e);
- return;
- }
if(srv->write)
srv->write(r);
else
case Tattach: rattach(r, error); break;
case Twalk: rwalk(r, error); break;
case Topen: ropen(r, error); break;
- case Tcreate: rcreate(r, error); break;
+ case Tcreate: ropen(r, error); break;
case Tread: rread(r, error); break;
case Twrite: rwrite(r, error); break;
case Tclunk: rclunk(r, error); break;
rerrstr(errbuf, sizeof errbuf);
respond(r, errbuf);
}
-
-int
-postfd(char *name, int pfd)
-{
- int fd;
- char buf[80];
-
- snprint(buf, sizeof buf, "/srv/%s", name);
- if(chatty9p)
- fprint(2, "postfd %s\n", buf);
- fd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600);
- if(fd < 0){
- if(chatty9p)
- fprint(2, "create fails: %r\n");
- return -1;
- }
- if(fprint(fd, "%d", pfd) < 0){
- if(chatty9p)
- fprint(2, "write fails: %r\n");
- close(fd);
- return -1;
- }
- if(chatty9p)
- fprint(2, "postfd successful\n");
- return 0;
-}
-
-int
-sharefd(char *name, char *desc, int pfd)
-{
- int fd;
- char buf[80];
-
- snprint(buf, sizeof buf, "#σc/%s", name);
- if((fd = create(buf, OREAD, 0700|DMDIR)) >= 0)
- close(fd);
- snprint(buf, sizeof buf, "#σc/%s/%s", name, desc);
- if(chatty9p)
- fprint(2, "sharefd %s\n", buf);
- fd = create(buf, OWRITE, 0600);
- if(fd < 0){
- if(chatty9p)
- fprint(2, "create fails: %r\n");
- return -1;
- }
- if(fprint(fd, "%d\n", pfd) < 0){
- if(chatty9p)
- fprint(2, "write fails: %r\n");
- close(fd);
- return -1;
- }
- close(fd);
- if(chatty9p)
- fprint(2, "sharefd successful\n");
- return 0;
-}