From 16ab3c5f9d929a80d764dead8ea2162a1dc4d5da Mon Sep 17 00:00:00 2001 From: stasoid Date: Thu, 24 Oct 2024 22:56:43 +0500 Subject: [PATCH] LibCore: Port DirIterator to Windows using vcpkg dirent.h --- Userland/Libraries/LibCore/CMakeLists.txt | 5 +++++ Userland/Libraries/LibCore/DirIterator.cpp | 7 +++++-- Userland/Libraries/LibCore/DirIterator.h | 3 --- Userland/Libraries/LibCore/DirectoryEntry.cpp | 21 ++++++++++++------- Userland/Libraries/LibCore/DirectoryEntry.h | 8 +++++-- vcpkg.json | 4 ++++ 6 files changed, 34 insertions(+), 14 deletions(-) diff --git a/Userland/Libraries/LibCore/CMakeLists.txt b/Userland/Libraries/LibCore/CMakeLists.txt index 200dfffaccb..a754d6be3c5 100644 --- a/Userland/Libraries/LibCore/CMakeLists.txt +++ b/Userland/Libraries/LibCore/CMakeLists.txt @@ -21,6 +21,11 @@ endif() serenity_lib(LibCoreMinimal coreminimal) +if (WIN32) + find_path(DIRENT_INCLUDE_DIR dirent.h REQUIRED) + target_include_directories(LibCoreMinimal PRIVATE ${DIRENT_INCLUDE_DIR}) +endif() + if (LAGOM_TOOLS_ONLY) return() endif() diff --git a/Userland/Libraries/LibCore/DirIterator.cpp b/Userland/Libraries/LibCore/DirIterator.cpp index 76f41a61d74..e05b1e6ce9d 100644 --- a/Userland/Libraries/LibCore/DirIterator.cpp +++ b/Userland/Libraries/LibCore/DirIterator.cpp @@ -5,9 +5,8 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include -#include +#include #include #include @@ -79,6 +78,7 @@ bool DirIterator::advance_next() if (m_flags & Flags::SkipParentAndBaseDir && (m_next->name == "." || m_next->name == "..")) continue; +#ifndef AK_OS_WINDOWS 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. @@ -94,6 +94,7 @@ bool DirIterator::advance_next() m_next->type = DirectoryEntry::directory_entry_type_from_stat(statbuf.st_mode); } } +#endif return !m_next->name.is_empty(); } @@ -135,11 +136,13 @@ ByteString DirIterator::next_full_path() return builder.to_byte_string(); } +#ifndef AK_OS_WINDOWS int DirIterator::fd() const { if (!m_dir) return -1; return dirfd(m_dir); } +#endif } diff --git a/Userland/Libraries/LibCore/DirIterator.h b/Userland/Libraries/LibCore/DirIterator.h index 262ef5844ae..be0fc341d0c 100644 --- a/Userland/Libraries/LibCore/DirIterator.h +++ b/Userland/Libraries/LibCore/DirIterator.h @@ -7,10 +7,7 @@ #pragma once -#include #include -#include -#include namespace Core { diff --git a/Userland/Libraries/LibCore/DirectoryEntry.cpp b/Userland/Libraries/LibCore/DirectoryEntry.cpp index b51c752e583..9bc2543ce54 100644 --- a/Userland/Libraries/LibCore/DirectoryEntry.cpp +++ b/Userland/Libraries/LibCore/DirectoryEntry.cpp @@ -5,6 +5,7 @@ */ #include "DirectoryEntry.h" +#include #include namespace Core { @@ -68,14 +69,16 @@ DirectoryEntry::Type DirectoryEntry::directory_entry_type_from_stat(mode_t st_mo return DirectoryEntry::Type::CharacterDevice; case S_IFDIR: return DirectoryEntry::Type::Directory; - case S_IFBLK: - return DirectoryEntry::Type::BlockDevice; case S_IFREG: return DirectoryEntry::Type::File; case S_IFLNK: return DirectoryEntry::Type::SymbolicLink; +#ifndef AK_OS_WINDOWS + case S_IFBLK: + return DirectoryEntry::Type::BlockDevice; case S_IFSOCK: return DirectoryEntry::Type::Socket; +#endif default: return DirectoryEntry::Type::Unknown; } @@ -83,7 +86,7 @@ DirectoryEntry::Type DirectoryEntry::directory_entry_type_from_stat(mode_t st_mo } #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU) -static DirectoryEntry::Type directory_entry_type_from_posix(unsigned char dt_constant) +static DirectoryEntry::Type directory_entry_type_from_posix(int dt_constant) { switch (dt_constant) { case DT_UNKNOWN: @@ -94,15 +97,17 @@ static DirectoryEntry::Type directory_entry_type_from_posix(unsigned char dt_con return DirectoryEntry::Type::CharacterDevice; case DT_DIR: return DirectoryEntry::Type::Directory; - case DT_BLK: - return DirectoryEntry::Type::BlockDevice; case DT_REG: return DirectoryEntry::Type::File; case DT_LNK: return DirectoryEntry::Type::SymbolicLink; +# ifndef AK_OS_WINDOWS + case DT_BLK: + return DirectoryEntry::Type::BlockDevice; case DT_SOCK: return DirectoryEntry::Type::Socket; -# ifndef AK_OS_OPENBSD +# endif +# if !defined AK_OS_OPENBSD && !defined AK_OS_WINDOWS case DT_WHT: return DirectoryEntry::Type::Whiteout; # endif @@ -111,6 +116,7 @@ static DirectoryEntry::Type directory_entry_type_from_posix(unsigned char dt_con } #endif +#ifndef AK_OS_WINDOWS DirectoryEntry DirectoryEntry::from_stat(DIR* d, dirent const& de) { struct stat statbuf; @@ -121,6 +127,7 @@ DirectoryEntry DirectoryEntry::from_stat(DIR* d, dirent const& de) .inode_number = de.d_ino, }; } +#endif #if !defined(AK_OS_SOLARIS) && !defined(AK_OS_HAIKU) DirectoryEntry DirectoryEntry::from_dirent(dirent const& de) @@ -128,7 +135,7 @@ DirectoryEntry DirectoryEntry::from_dirent(dirent const& de) return DirectoryEntry { .type = directory_entry_type_from_posix(de.d_type), .name = de.d_name, - .inode_number = de.d_ino, + .inode_number = (ino_t)de.d_ino, }; } #endif diff --git a/Userland/Libraries/LibCore/DirectoryEntry.h b/Userland/Libraries/LibCore/DirectoryEntry.h index c33d4adf750..b552e36cf00 100644 --- a/Userland/Libraries/LibCore/DirectoryEntry.h +++ b/Userland/Libraries/LibCore/DirectoryEntry.h @@ -7,8 +7,12 @@ #pragma once #include -#include -#include +#ifdef AK_OS_WINDOWS +struct dirent; +struct DIR; +#else +# include +#endif namespace Core { diff --git a/vcpkg.json b/vcpkg.json index 68a00d06859..28afe487165 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -8,6 +8,10 @@ "http2" ] }, + { + "name": "dirent", + "platform": "windows" + }, { "name": "fontconfig", "platform": "linux | freebsd | openbsd | osx | windows"