upas/fs: fix broken body.ext in walk (thanks sl)
This commit is contained in:
parent
da9f1ccc28
commit
f75b4fddb3
1 changed files with 41 additions and 35 deletions
|
@ -790,45 +790,16 @@ dindex(char *name)
|
||||||
char*
|
char*
|
||||||
dowalk(Fid *f, char *name)
|
dowalk(Fid *f, char *name)
|
||||||
{
|
{
|
||||||
char *rv, *p;
|
char *p;
|
||||||
Hash *h;
|
Hash *h;
|
||||||
int t;
|
int t;
|
||||||
|
|
||||||
if(f->qid.type != QTDIR)
|
if(f->qid.type != QTDIR)
|
||||||
return Enotdir;
|
return Enotdir;
|
||||||
t = FILE(f->qid.path);
|
t = FILE(f->qid.path);
|
||||||
rv = Enotexist;
|
if(strcmp(name, ".") == 0)
|
||||||
|
return nil;
|
||||||
/* this must catch everything except . and .. */
|
if(strcmp(name, "..") == 0){
|
||||||
retry:
|
|
||||||
if(t == Qdir && *name >= 'a' && *name <= 'z'){
|
|
||||||
h = hlook(f->qid.path, "xxx"); /* sleezy speedup */
|
|
||||||
t = dindex(name);
|
|
||||||
if(t == -1)
|
|
||||||
h = nil;
|
|
||||||
} else
|
|
||||||
h = hlook(f->qid.path, name);
|
|
||||||
if(h != nil){
|
|
||||||
if(h->mb)
|
|
||||||
mboxincref(h->mb);
|
|
||||||
if(h->m)
|
|
||||||
msgincref(h->mb, h->m);
|
|
||||||
if(f->m)
|
|
||||||
msgdecref(f->mb, f->m);
|
|
||||||
if(f->mb)
|
|
||||||
mboxdecref(f->mb);
|
|
||||||
f->m = h->m;
|
|
||||||
f->mb = h->mb;
|
|
||||||
f->qid = h->qid;
|
|
||||||
if(t < Qmax)
|
|
||||||
f->qid.path = PATH(f->m->id, t); /* sleezy speedup */
|
|
||||||
rv = nil;
|
|
||||||
}else if((p = strchr(name, '.')) != nil && *name != '.'){
|
|
||||||
*p = 0;
|
|
||||||
goto retry;
|
|
||||||
} else if(strcmp(name, ".") == 0){
|
|
||||||
rv = nil;
|
|
||||||
} else if(strcmp(name, "..") == 0){
|
|
||||||
switch(t){
|
switch(t){
|
||||||
case Qtop:
|
case Qtop:
|
||||||
f->qid.path = PATH(0, Qtop);
|
f->qid.path = PATH(0, Qtop);
|
||||||
|
@ -858,9 +829,44 @@ retry:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rv = nil;
|
return nil;
|
||||||
}
|
}
|
||||||
return rv;
|
|
||||||
|
/* this must catch everything except . and .. */
|
||||||
|
if(t == Qdir && *name >= 'a' && *name <= 'z'){
|
||||||
|
for(;;){
|
||||||
|
t = dindex(name);
|
||||||
|
if(t == -1){
|
||||||
|
if((p = strchr(name, '.')) != nil && *name != '.'){
|
||||||
|
*p = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
h = hlook(f->qid.path, "xxx"); /* sleezy speedup */
|
||||||
|
} else {
|
||||||
|
h = hlook(f->qid.path, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(h == nil)
|
||||||
|
return Enotexist;
|
||||||
|
|
||||||
|
if(h->mb)
|
||||||
|
mboxincref(h->mb);
|
||||||
|
if(h->m)
|
||||||
|
msgincref(h->mb, h->m);
|
||||||
|
if(f->m)
|
||||||
|
msgdecref(f->mb, f->m);
|
||||||
|
if(f->mb)
|
||||||
|
mboxdecref(f->mb);
|
||||||
|
f->m = h->m;
|
||||||
|
f->mb = h->mb;
|
||||||
|
f->qid = h->qid;
|
||||||
|
if(t < Qmax)
|
||||||
|
f->qid.path = PATH(f->m->id, t); /* sleezy speedup */
|
||||||
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue