From e89dc046746d51e327beac13c38bf8ce24be51d9 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Wed, 23 Dec 2015 17:08:19 +0100 Subject: [PATCH] Add extfs support for d_type. --- ext/extfs.cpp | 17 +++++++++++++++++ ext/extfs.h | 1 + ext/fsmarshall.cpp | 6 +++++- ext/inode.cpp | 6 ++++-- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ext/extfs.cpp b/ext/extfs.cpp index c7da5390..bf1a3f88 100644 --- a/ext/extfs.cpp +++ b/ext/extfs.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -92,6 +93,22 @@ uint32_t ExtModeFromHostMode(mode_t hostmode) return extmode; } +uint8_t HostDTFromExtDT(uint8_t extdt) +{ + switch ( extdt ) + { + case EXT2_FT_UNKNOWN: return DT_UNKNOWN; + case EXT2_FT_REG_FILE: return DT_REG; + case EXT2_FT_DIR: return DT_DIR; + case EXT2_FT_CHRDEV: return DT_CHR; + case EXT2_FT_BLKDEV: return DT_BLK; + case EXT2_FT_FIFO: return DT_FIFO; + case EXT2_FT_SOCK: return DT_SOCK; + case EXT2_FT_SYMLINK: return DT_LNK; + } + return DT_UNKNOWN; +} + void StatInode(Inode* inode, struct stat* st) { memset(st, 0, sizeof(*st)); diff --git a/ext/extfs.h b/ext/extfs.h index 150b8152..7abfe16a 100644 --- a/ext/extfs.h +++ b/ext/extfs.h @@ -30,6 +30,7 @@ class Inode; mode_t HostModeFromExtMode(uint32_t extmode); uint32_t ExtModeFromHostMode(mode_t hostmode); +uint8_t HostDTFromExtDT(uint8_t extdt); void StatInode(Inode* inode, struct stat* st); #endif diff --git a/ext/fsmarshall.cpp b/ext/fsmarshall.cpp index 48ac79c3..27e8292d 100644 --- a/ext/fsmarshall.cpp +++ b/ext/fsmarshall.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -397,10 +398,13 @@ void HandleReadDir(int chl, struct fsm_req_readdirents* msg, Filesystem* fs) const struct ext_dirent* entry = (const struct ext_dirent*) block_data; if ( entry->inode && entry->name_len && !(msg->rec_num--) ) { + uint8_t file_type = EXT2_FT_UNKNOWN; + if ( fs->sb->s_feature_incompat & EXT2_FEATURE_INCOMPAT_FILETYPE ) + file_type = entry->file_type; kernel_entry.d_reclen = sizeof(kernel_entry) + entry->name_len; kernel_entry.d_ino = entry->inode; kernel_entry.d_dev = 0; - kernel_entry.d_type = 0; // TODO: Support this! + kernel_entry.d_type = HostDTFromExtDT(file_type); kernel_entry.d_namlen = entry->name_len; memcpy(kernel_entry.d_name, entry->name, entry->name_len); size_t dname_offset = offsetof(struct dirent, d_name); diff --git a/ext/inode.cpp b/ext/inode.cpp index f722b359..61175b21 100644 --- a/ext/inode.cpp +++ b/ext/inode.cpp @@ -428,7 +428,9 @@ Inode* Inode::Open(const char* elem, int flags, mode_t mode) entry->name_len == elem_length && memcmp(elem, entry->name, elem_length) == 0 ) { - uint8_t file_type = entry->file_type; + uint8_t file_type = EXT2_FT_UNKNOWN; + if ( filesystem->sb->s_feature_incompat & EXT2_FEATURE_INCOMPAT_FILETYPE ) + file_type = entry->file_type; uint32_t inode_id = entry->inode; block->Unref(); if ( (flags & O_CREAT) && (flags & O_EXCL) ) @@ -602,7 +604,7 @@ bool Inode::Link(const char* elem, Inode* dest, bool directories) if ( filesystem->sb->s_feature_incompat & EXT2_FEATURE_INCOMPAT_FILETYPE ) entry->file_type = EXT2_FT_OF_MODE(dest->Mode()); else - entry->file_type = 0; + entry->file_type = EXT2_FT_UNKNOWN; strncpy(entry->name, elem, new_entry_size - sizeof(struct ext_dirent)); block->FinishWrite();