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 204bd89aa4c..89560c7a4ef 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 095991e27b7..46efb45934f 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 68ad869003f..8d13ff1fa88 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;