From 03fcbb15d24e2eec41bac9f5dee30bbf7dc888b8 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 27 Nov 2018 12:45:53 +0100 Subject: fs: Add struct dirent::d_type support --- cpukit/libfs/src/dosfs/msdos_dir.c | 11 +++++++++++ cpukit/libfs/src/imfs/imfs_dir_default.c | 3 +++ cpukit/libfs/src/jffs2/include/linux/fs.h | 5 +++++ cpukit/libfs/src/jffs2/src/fs-rtems.c | 11 +++++++---- cpukit/libfs/src/nfsclient/src/nfs.c | 3 +++ 5 files changed, 29 insertions(+), 4 deletions(-) (limited to 'cpukit/libfs/src') diff --git a/cpukit/libfs/src/dosfs/msdos_dir.c b/cpukit/libfs/src/dosfs/msdos_dir.c index a13caafa7e..fee6491c7d 100644 --- a/cpukit/libfs/src/dosfs/msdos_dir.c +++ b/cpukit/libfs/src/dosfs/msdos_dir.c @@ -236,6 +236,17 @@ msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count) continue; } +#ifdef DT_DIR + if ((*MSDOS_DIR_ATTR(entry)) & MSDOS_ATTR_DIRECTORY) + { + tmp_dirent.d_type = DT_DIR; + } + else + { + tmp_dirent.d_type = DT_REG; + } +#endif + /* * Move the entry to the return buffer * diff --git a/cpukit/libfs/src/imfs/imfs_dir_default.c b/cpukit/libfs/src/imfs/imfs_dir_default.c index 03ef115301..7bb4f378e1 100644 --- a/cpukit/libfs/src/imfs/imfs_dir_default.c +++ b/cpukit/libfs/src/imfs/imfs_dir_default.c @@ -74,6 +74,9 @@ static ssize_t IMFS_dir_read( dir_ent->d_off = current_entry; dir_ent->d_reclen = sizeof( *dir_ent ); dir_ent->d_ino = IMFS_node_to_ino( imfs_node ); +#ifdef DT_DIR + dir_ent->d_type = IFTODT( imfs_node->st_mode ); +#endif dir_ent->d_namlen = MIN( imfs_node->namelen, sizeof( dir_ent->d_name ) - 1 ); dir_ent->d_name[ dir_ent->d_namlen ] = '\0'; diff --git a/cpukit/libfs/src/jffs2/include/linux/fs.h b/cpukit/libfs/src/jffs2/include/linux/fs.h index 8da9880b13..a638e7b6bf 100644 --- a/cpukit/libfs/src/jffs2/include/linux/fs.h +++ b/cpukit/libfs/src/jffs2/include/linux/fs.h @@ -3,12 +3,17 @@ #include #include +#include #include +#ifdef DT_DIR +#define RTEMS_JFFS2_HAVE_D_TYPE +#else #define DT_UNKNOWN 0 #define DT_DIR 4 #define DT_REG 8 #define DT_LNK 10 +#endif #define ATTR_MODE (1U << 0) #define ATTR_UID (1U << 1) diff --git a/cpukit/libfs/src/jffs2/src/fs-rtems.c b/cpukit/libfs/src/jffs2/src/fs-rtems.c index 17a4985607..aae208ccef 100644 --- a/cpukit/libfs/src/jffs2/src/fs-rtems.c +++ b/cpukit/libfs/src/jffs2/src/fs-rtems.c @@ -423,7 +423,7 @@ static int rtems_jffs2_fstat( return 0; } -static int rtems_jffs2_fill_dirent(struct dirent *de, off_t off, uint32_t ino, const char *name) +static int rtems_jffs2_fill_dirent(struct dirent *de, off_t off, uint32_t ino, const char *name, unsigned char type) { int eno = 0; size_t len; @@ -433,6 +433,9 @@ static int rtems_jffs2_fill_dirent(struct dirent *de, off_t off, uint32_t ino, c de->d_off = off * sizeof(*de); de->d_reclen = sizeof(*de); de->d_ino = ino; +#ifdef RTEMS_JFFS2_HAVE_D_TYPE + de->d_type = type; +#endif len = strlen(name); de->d_namlen = len; @@ -466,14 +469,14 @@ static ssize_t rtems_jffs2_dir_read(rtems_libio_t *iop, void *buf, size_t len) off = begin; if (off == 0 && off < end) { - eno = rtems_jffs2_fill_dirent(de, off, inode->i_ino, "."); + eno = rtems_jffs2_fill_dirent(de, off, inode->i_ino, ".", DT_DIR); assert(eno == 0); ++off; ++de; } if (off == 1 && off < end) { - eno = rtems_jffs2_fill_dirent(de, off, inode->i_parent->i_ino, ".."); + eno = rtems_jffs2_fill_dirent(de, off, inode->i_parent->i_ino, "..", DT_DIR); assert(eno == 0); ++off; ++de; @@ -482,7 +485,7 @@ static ssize_t rtems_jffs2_dir_read(rtems_libio_t *iop, void *buf, size_t len) while (eno == 0 && off < end && fd != NULL) { if (fd->ino != 0) { if (off == fd_off) { - eno = rtems_jffs2_fill_dirent(de, off, fd->ino, fd->name); + eno = rtems_jffs2_fill_dirent(de, off, fd->ino, fd->name, fd->type); ++off; ++de; } diff --git a/cpukit/libfs/src/nfsclient/src/nfs.c b/cpukit/libfs/src/nfsclient/src/nfs.c index ddb4dda313..bb338d58ca 100644 --- a/cpukit/libfs/src/nfsclient/src/nfs.c +++ b/cpukit/libfs/src/nfsclient/src/nfs.c @@ -327,6 +327,9 @@ nfscookie *pcookie; pde->d_ino = fileid; pde->d_namlen = nlen; pde->d_off = di->ptr - di->buf; +#ifdef DT_UNKNOWN + pde->d_type = DT_UNKNOWN; +#endif if (name == dummy.nambuf) { memcpy(pde->d_name, dummy.nambuf, nlen + 1); } -- cgit v1.2.3