Pārlūkot izejas kodu

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.
Liav A 1 gadu atpakaļ
vecāks
revīzija
603516e8c0

+ 3 - 1
Userland/Libraries/LibCore/DirIterator.cpp

@@ -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);

+ 1 - 0
Userland/Libraries/LibCore/DirIterator.h

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