diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2023-10-13 22:19:24 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-10-13 22:19:24 +0200 |
commit | 348c1ff96be116f8ec2f1786493b1b662f56b413 (patch) | |
tree | 23607aba8aa5162243d7b9c2cc528cd9150b6955 /drivers/unix/dir_access_unix.cpp | |
parent | 4659099a88bb56189f7fc4140bbdcde87d8e2b4e (diff) | |
parent | 54eae6221a68eb361131e1f0c13c69c47b394c9e (diff) | |
download | redot-engine-348c1ff96be116f8ec2f1786493b1b662f56b413.tar.gz |
Merge pull request #83266 from bruvzg/linux_case_check
[Linux] Implement DirAccess.is_case_sensitive for EXT4 and F2FS.
Diffstat (limited to 'drivers/unix/dir_access_unix.cpp')
-rw-r--r-- | drivers/unix/dir_access_unix.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 095991e27b..46efb45934 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 <errno.h> +#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/ioctl.h> #include <sys/statvfs.h> #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; |