LibCore: Add new flag for DirIterator to not use fstatat

This will be useful in the upcoming listdir utility (in the next commit)
to get the file type which is obtained in the get_dir_entries syscall,
so it's not changed later by the fstatat syscall.

This will ensure that we get the raw file type value as it's represented
by directory entries from the get_dir_entries syscall.
This commit is contained in:
Liav A 2024-01-06 11:38:43 +02:00 committed by Andrew Kaster
parent d568b09632
commit 603516e8c0
Notes: sideshowbarker 2024-07-18 05:01:22 +09:00
2 changed files with 4 additions and 1 deletions

View File

@ -82,7 +82,9 @@ bool DirIterator::advance_next()
if constexpr (dirent_has_d_type) {
// dirent structures from readdir aren't guaranteed to contain valid file types,
// as it is possible that the underlying filesystem doesn't keep track of those.
if (m_next->type == DirectoryEntry::Type::Unknown) {
// However, if we were requested to not do stat on the entries of this directory,
// the calling code will be given the raw unknown type.
if ((m_flags & Flags::NoStat) == 0 && m_next->type == DirectoryEntry::Type::Unknown) {
struct stat statbuf;
if (fstatat(dirfd(m_dir), de->d_name, &statbuf, AT_SYMLINK_NOFOLLOW) < 0) {
m_error = Error::from_errno(errno);

View File

@ -20,6 +20,7 @@ public:
NoFlags = 0x0,
SkipDots = 0x1,
SkipParentAndBaseDir = 0x2,
NoStat = 0x4,
};
explicit DirIterator(ByteString path, Flags = Flags::NoFlags);