diff --git a/fs/fs.c b/fs/fs.c index 81f74e47..3a864ed7 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -92,7 +92,7 @@ int open_fs(fildes_t* file, const char* name) j++; } - kprintf("-------------: dir_node = %p, file_node = %p, name = %s", dir_node, file_node, fname); + //kprintf("dir_node = %p, file_node = %p, name = %s", dir_node, file_node, fname); /* file exists */ if(file_node) { spinlock_lock(&file_node->lock); @@ -101,7 +101,7 @@ int open_fs(fildes_t* file, const char* name) if (file_node->open != 0) ret = file->node->open(file, NULL); spinlock_unlock(&file_node->lock); - } else if (dir_node) { /* file doesn't exist */ + } else if (dir_node) { /* file doesn't exist or opendir was called */ spinlock_lock(&dir_node->lock); file->node = dir_node; // Has the dir_node got an open callback? diff --git a/fs/initrd.c b/fs/initrd.c index 1034cdee..36d07ee8 100644 --- a/fs/initrd.c +++ b/fs/initrd.c @@ -212,6 +212,11 @@ static int initrd_open(fildes_t* file, const char* name) } if (file->node->type == FS_DIRECTORY) { + /* opendir was called: */ + if (name[0] == '\0') + return 0; + + /* open file was called: */ if (!(file->flags & O_CREAT)) return -ENOENT; diff --git a/newlib/src/libgloss/metalsvm/opendir.c b/newlib/src/libgloss/metalsvm/opendir.c index 948b57b0..052b8476 100644 --- a/newlib/src/libgloss/metalsvm/opendir.c +++ b/newlib/src/libgloss/metalsvm/opendir.c @@ -53,11 +53,12 @@ _DEFUN (opendir, (name), int fd; fd = open(name, 0); + if (fd < 0) return NULL; dirp = (DIR *)malloc(sizeof(DIR)); if (dirp == NULL) { - close (fd); + close(fd); return NULL; } @@ -65,12 +66,11 @@ _DEFUN (opendir, (name), dirp->dd_len = 512; if (dirp->dd_buf == NULL) { - close (fd); + close(fd); return NULL; } dirp->dd_fd = fd; dirp->dd_loc = 0; - /* Set up seek point for rewinddir. */ dirp->dd_seek = 0;