diff options
Diffstat (limited to 'drivers/unix')
-rw-r--r-- | drivers/unix/SCsub | 2 | ||||
-rw-r--r-- | drivers/unix/dir_access_unix.cpp | 29 | ||||
-rw-r--r-- | drivers/unix/dir_access_unix.h | 2 | ||||
-rw-r--r-- | drivers/unix/os_unix.cpp | 6 |
4 files changed, 34 insertions, 5 deletions
diff --git a/drivers/unix/SCsub b/drivers/unix/SCsub index 91ef613546..146563a3b6 100644 --- a/drivers/unix/SCsub +++ b/drivers/unix/SCsub @@ -4,4 +4,4 @@ Import("env") env.add_source_files(env.drivers_sources, "*.cpp") -env["check_c_headers"] = [["mntent.h", "HAVE_MNTENT"]] +env["check_c_headers"] = {"mntent.h": "HAVE_MNTENT"} diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index a162f46103..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 @@ -339,7 +341,7 @@ Error DirAccessUnix::change_dir(String p_dir) { // prev_dir is the directory we are changing out of String prev_dir; char real_current_dir_name[2048]; - ERR_FAIL_COND_V(getcwd(real_current_dir_name, 2048) == nullptr, ERR_BUG); + ERR_FAIL_NULL_V(getcwd(real_current_dir_name, 2048), ERR_BUG); if (prev_dir.parse_utf8(real_current_dir_name) != OK) { prev_dir = real_current_dir_name; //no utf8, maybe latin? } @@ -361,7 +363,7 @@ Error DirAccessUnix::change_dir(String p_dir) { String base = _get_root_path(); if (!base.is_empty() && !try_dir.begins_with(base)) { - ERR_FAIL_COND_V(getcwd(real_current_dir_name, 2048) == nullptr, ERR_BUG); + ERR_FAIL_NULL_V(getcwd(real_current_dir_name, 2048), ERR_BUG); String new_dir; new_dir.parse_utf8(real_current_dir_name); @@ -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; @@ -496,7 +519,7 @@ DirAccessUnix::DirAccessUnix() { // set current directory to an absolute path of the current directory char real_current_dir_name[2048]; - ERR_FAIL_COND(getcwd(real_current_dir_name, 2048) == nullptr); + ERR_FAIL_NULL(getcwd(real_current_dir_name, 2048)); if (current_dir.parse_utf8(real_current_dir_name) != OK) { current_dir = real_current_dir_name; } 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..581daaca05 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -81,6 +81,10 @@ #include <time.h> #include <unistd.h> +#ifndef RTLD_DEEPBIND +#define RTLD_DEEPBIND 0 +#endif + #if defined(MACOS_ENABLED) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 28) // Random location for getentropy. Fitting. #include <sys/random.h> @@ -646,7 +650,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(), RTLD_NOW | RTLD_DEEPBIND); 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) { |