diff options
Diffstat (limited to 'drivers/unix')
-rw-r--r-- | drivers/unix/dir_access_unix.cpp | 23 | ||||
-rw-r--r-- | drivers/unix/dir_access_unix.h | 2 | ||||
-rw-r--r-- | drivers/unix/os_unix.cpp | 12 |
3 files changed, 36 insertions, 1 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; diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h index 68ad869003..8d13ff1fa8 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; diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 4d9549c5a6..9a77930d75 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -81,6 +81,16 @@ #include <time.h> #include <unistd.h> +#ifndef RTLD_DEEPBIND +#define RTLD_DEEPBIND 0 +#endif + +#ifndef SANITIZERS_ENABLED +#define GODOT_DLOPEN_MODE RTLD_NOW | RTLD_DEEPBIND +#else +#define GODOT_DLOPEN_MODE RTLD_NOW +#endif + #if defined(MACOS_ENABLED) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 28) // Random location for getentropy. Fitting. #include <sys/random.h> @@ -646,7 +656,7 @@ Error OS_Unix::open_dynamic_library(const String p_path, void *&p_library_handle path = get_executable_path().get_base_dir().path_join("../lib").path_join(p_path.get_file()); } - p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW); + p_library_handle = dlopen(path.utf8().get_data(), GODOT_DLOPEN_MODE); ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror())); if (r_resolved_path != nullptr) { |