make dirlookup and dirlink more similar

This commit is contained in:
Robert Morris 2011-08-19 13:30:57 -04:00
parent cd3d739e6f
commit 327cc21fba
2 changed files with 66 additions and 18 deletions

31
fs.c
View file

@ -469,30 +469,25 @@ struct inode*
dirlookup(struct inode *dp, char *name, uint *poff)
{
uint off, inum;
struct buf *bp;
struct dirent *de;
struct dirent de;
if(dp->type != T_DIR)
panic("dirlookup not DIR");
for(off = 0; off < dp->size; off += BSIZE){
bp = bread(dp->dev, bmap(dp, off / BSIZE));
for(de = (struct dirent*)bp->data;
de < (struct dirent*)(bp->data + BSIZE);
de++){
if(de->inum == 0)
continue;
if(namecmp(name, de->name) == 0){
// entry matches path element
if(poff)
*poff = off + (uchar*)de - bp->data;
inum = de->inum;
brelse(bp);
return iget(dp->dev, inum);
}
for(off = 0; off < dp->size; off += sizeof(de)){
if(readi(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
panic("dirlink read");
if(de.inum == 0)
continue;
if(namecmp(name, de.name) == 0){
// entry matches path element
if(poff)
*poff = off;
inum = de.inum;
return iget(dp->dev, inum);
}
brelse(bp);
}
return 0;
}