|
@@ -299,6 +299,8 @@ fsdirgen(Fs *fs, Qid parent, int i, Dir *d, uchar *buf, int nbuf)
|
|
|
p = fs->cons[xcons]->name;
|
|
|
switch(i%3){
|
|
|
case 0:
|
|
|
+ if(fs->cons[xcons]->cfd < 0)
|
|
|
+ return 0;
|
|
|
snprint(name, sizeof name, "%sctl", p);
|
|
|
p = name;
|
|
|
d->qid.type = QTFILE;
|
|
@@ -306,6 +308,8 @@ fsdirgen(Fs *fs, Qid parent, int i, Dir *d, uchar *buf, int nbuf)
|
|
|
d->qid.vers = 0;
|
|
|
break;
|
|
|
case 1:
|
|
|
+ if(fs->cons[xcons]->sfd < 0)
|
|
|
+ return 0;
|
|
|
snprint(name, sizeof name, "%sstat", p);
|
|
|
p = name;
|
|
|
d->qid.type = QTFILE;
|
|
@@ -326,7 +330,7 @@ fsdirgen(Fs *fs, Qid parent, int i, Dir *d, uchar *buf, int nbuf)
|
|
|
d->name = p;
|
|
|
if(buf != nil)
|
|
|
return convD2M(d, buf, nbuf);
|
|
|
- return 0;
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -788,7 +792,7 @@ fswalk(Fs *fs, Request *r, Fid *f)
|
|
|
{
|
|
|
char *name;
|
|
|
Dir d;
|
|
|
- int i, nqid, nwname;
|
|
|
+ int i, n, nqid, nwname;
|
|
|
Qid qid, wqid[MAXWELEM];
|
|
|
Fid *nf;
|
|
|
char *err;
|
|
@@ -826,11 +830,12 @@ fswalk(Fs *fs, Request *r, Fid *f)
|
|
|
qid = parentqid(qid);
|
|
|
else if(strcmp(name, ".") != 0){
|
|
|
for(i = 0; ; i++){
|
|
|
- if(fsdirgen(fs, qid, i, &d, nil, 0) < 0){
|
|
|
+ n = fsdirgen(fs, qid, i, &d, nil, 0);
|
|
|
+ if(n < 0){
|
|
|
err = Eexist;
|
|
|
break;
|
|
|
}
|
|
|
- if(strcmp(name, d.name) == 0){
|
|
|
+ if(n > 0 && strcmp(name, d.name) == 0){
|
|
|
qid = d.qid;
|
|
|
break;
|
|
|
}
|
|
@@ -992,9 +997,9 @@ fsread(Fs *fs, Request *r, Fid *f)
|
|
|
off = 0;
|
|
|
for(i=0; p<e; i++, off+=m){
|
|
|
m = fsdirgen(fs, f->qid, i, &d, p, e-p);
|
|
|
- if(m <= BIT16SZ)
|
|
|
+ if(m < 0)
|
|
|
break;
|
|
|
- if(off >= offset)
|
|
|
+ if(m > BIT16SZ && off >= offset)
|
|
|
p += m;
|
|
|
}
|
|
|
r->f.data = (char*)r->buf + IOHDRSZ;
|
|
@@ -1113,11 +1118,12 @@ fsstat(Fs *fs, Request *r, Fid *f)
|
|
|
q = parentqid(f->qid);
|
|
|
for(i = 0; ; i++){
|
|
|
r->f.stat = r->buf+IOHDRSZ;
|
|
|
- if((r->f.nstat = fsdirgen(fs, q, i, &d, r->f.stat, messagesize-IOHDRSZ)) <= BIT16SZ){
|
|
|
+ r->f.nstat = fsdirgen(fs, q, i, &d, r->f.stat, messagesize-IOHDRSZ);
|
|
|
+ if(r->f.nstat < 0){
|
|
|
fsreply(fs, r, Eexist);
|
|
|
return;
|
|
|
}
|
|
|
- if(d.qid.path == f->qid.path)
|
|
|
+ if(r->f.nstat > BIT16SZ && d.qid.path == f->qid.path)
|
|
|
break;
|
|
|
}
|
|
|
fsreply(fs, r, nil);
|