[LibOS] Correctly set type of directory entries

Fixes #531
This commit is contained in:
Rafał Wojdyła
2019-04-15 19:34:33 -04:00
committed by Don Porter
parent 0a0babc26a
commit d362b2969b
3 changed files with 13 additions and 8 deletions
+3 -3
View File
@@ -228,9 +228,9 @@ static int __query_attr (struct shim_dentry * dent,
/* need to correct the data type */
if (data->type == FILE_UNKNOWN)
switch (pal_attr.handle_type) {
case pal_type_file: data->type = FILE_REGULAR; break;
case pal_type_dir: data->type = FILE_DIR; break;
case pal_type_dev: data->type = FILE_DEV; break;
case pal_type_file: data->type = FILE_REGULAR; if (dent) dent->type = S_IFREG; break;
case pal_type_dir: data->type = FILE_DIR; if (dent) dent->type = S_IFDIR; break;
case pal_type_dev: data->type = FILE_DEV; if (dent) dent->type = S_IFCHR; break;
}
data->mode = (pal_attr.readable ? S_IRUSR : 0) |
+6 -1
View File
@@ -541,8 +541,10 @@ int open_namei (struct shim_handle * hdl, struct shim_dentry * start,
newly_created = 1;
// If we didn't get an error and made a directory, set the dcache dir flag
if (flags & O_DIRECTORY)
if (flags & O_DIRECTORY) {
mydent->state |= DENTRY_ISDIRECTORY;
mydent->type = S_IFDIR;
}
// Once the dentry is creat-ed, drop the negative flag
mydent->state &= ~DENTRY_NEGATIVE;
@@ -651,6 +653,9 @@ out:
static inline void set_dirent_type (mode_t * type, int d_type)
{
switch (d_type) {
case LINUX_DT_DIR:
*type = S_IFDIR;
return;
case LINUX_DT_FIFO:
*type = S_IFIFO;
return;
+4 -4
View File
@@ -387,7 +387,7 @@ size_t shim_do_getdents (int fd, struct linux_dirent * buf, size_t count)
memcpy(b->d_name, name, len + 1); \
\
bt->pad = 0; \
bt->d_type = type ? : get_dirent_type(dent->mode); \
bt->d_type = type; \
\
b = (void *) bt + sizeof(struct linux_dirent_tail); \
bytes += DIRENT_SIZE(len); \
@@ -416,7 +416,7 @@ size_t shim_do_getdents (int fd, struct linux_dirent * buf, size_t count)
dent = *dirhdl->ptr;
/* DEP 3/3/17: We need to filter negative dentries */
if (!(dent->state & DENTRY_NEGATIVE))
ASSIGN_DIRENT(dent, dentry_get_name(dent), 0);
ASSIGN_DIRENT(dent, dentry_get_name(dent), get_dirent_type(dent->type));
put_dentry(dent);
*(dirhdl->ptr++) = NULL;
}
@@ -484,7 +484,7 @@ size_t shim_do_getdents64 (int fd, struct linux_dirent64 * buf, size_t count)
b->d_ino = dent->ino; \
b->d_off = ++dirhdl->offset; \
b->d_reclen = DIRENT_SIZE(len); \
b->d_type = type ? : get_dirent_type(dent->mode); \
b->d_type = type; \
\
memcpy(b->d_name, name, len + 1); \
\
@@ -513,7 +513,7 @@ size_t shim_do_getdents64 (int fd, struct linux_dirent64 * buf, size_t count)
dent = *dirhdl->ptr;
/* DEP 3/3/17: We need to filter negative dentries */
if (!(dent->state & DENTRY_NEGATIVE))
ASSIGN_DIRENT(dent, dentry_get_name(dent), 0);
ASSIGN_DIRENT(dent, dentry_get_name(dent), get_dirent_type(dent->type));
put_dentry(dent);
*(dirhdl->ptr++) = NULL;
}