提交 022104b1 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

make ls work

上级 1d1e1ede
......@@ -62,6 +62,7 @@ int readi(struct inode*, char*, uint, uint);
void stati(struct inode*, struct stat*);
int writei(struct inode*, char*, uint, uint);
void dir_init(struct inode *dp);
void dir_flush(struct inode *dp);
// ide.c
void ideinit(void);
......
......@@ -587,15 +587,39 @@ dir_init(struct inode *dp)
}
}
struct flush_state {
struct inode *dp;
uint off;
};
static void *
dir_flush_cb(void *key, void *val, void *arg)
{
struct flush_state *fs = arg;
char *name = key;
uint inum = (uint) val;
struct dirent de;
strncpy(de.name, name, DIRSIZ);
de.inum = inum;
if(writei(fs->dp, (char*)&de, fs->off, sizeof(de)) != sizeof(de))
panic("dir_flush_cb");
fs->off += sizeof(de);
return 0;
}
void
dir_flush(struct inode *dp)
{
// assume already locked
if (!dp->dir)
return;
ilock(dp, 1);
iunlock(dp);
struct flush_state fs;
fs.dp = dp;
fs.off = 0;
ns_enumerate(dp->dir, dir_flush_cb, &fs);
}
// Look for a directory entry in a directory.
......
......@@ -284,10 +284,14 @@ sys_open(void)
ilock(ip, 0);
if(ip->type == 0)
panic("open");
if(ip->type == T_DIR && omode != O_RDONLY){
if(ip->type == T_DIR) {
if (omode != O_RDONLY){
iunlockput(ip);
return -1;
}
dir_flush(ip);
}
}
if((f = filealloc()) == 0 || (fd = fdalloc(f)) < 0){
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论