From 54eae6221a68eb361131e1f0c13c69c47b394c9e Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Fri, 13 Oct 2023 15:48:03 +0300 Subject: [PATCH] [Linux] Implement DirAccess.is_case_sensitive for EXT4 and F2FS. --- doc/classes/DirAccess.xml | 2 +- drivers/unix/dir_access_unix.cpp | 23 +++++++++++++++++++++++ drivers/unix/dir_access_unix.h | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/doc/classes/DirAccess.xml b/doc/classes/DirAccess.xml index 204bd89aa4cb..89560c7a4efd 100644 --- a/doc/classes/DirAccess.xml +++ b/doc/classes/DirAccess.xml @@ -209,7 +209,7 @@ Returns [code]true[/code] if the file system or directory use case sensitive file names. - [b]Note:[/b] This method is implemented on macOS and Windows. On other platforms, it always returns [code]true[/code]. + [b]Note:[/b] This method is implemented on macOS, Linux (for EXT4 and F2FS filesystems only) and Windows. On other platforms, it always returns [code]true[/code]. diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 095991e27b7d..46efb45934f1 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -38,9 +38,11 @@ #include "core/templates/list.h" #include +#include #include #include #include +#include #include #ifdef HAVE_MNTENT @@ -488,6 +490,27 @@ bool DirAccessUnix::is_hidden(const String &p_name) { return p_name != "." && p_name != ".." && p_name.begins_with("."); } +bool DirAccessUnix::is_case_sensitive(const String &p_path) const { +#if defined(LINUXBSD_ENABLED) + String f = p_path; + if (!f.is_absolute_path()) { + f = get_current_dir().path_join(f); + } + f = fix_path(f); + + int fd = ::open(f.utf8().get_data(), O_RDONLY | O_NONBLOCK); + if (fd) { + long flags = 0; + if (ioctl(fd, _IOR('f', 1, long), &flags) >= 0) { + ::close(fd); + return !(flags & 0x40000000 /* FS_CASEFOLD_FL */); + } + ::close(fd); + } +#endif + return true; +} + DirAccessUnix::DirAccessUnix() { dir_stream = nullptr; _cisdir = false; diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h index 68ad869003fd..8d13ff1fa88d 100644 --- a/drivers/unix/dir_access_unix.h +++ b/drivers/unix/dir_access_unix.h @@ -82,6 +82,8 @@ public: virtual String read_link(String p_file) override; virtual Error create_link(String p_source, String p_target) override; + virtual bool is_case_sensitive(const String &p_path) const override; + virtual uint64_t get_space_left() override; virtual String get_filesystem_type() const override;