diff options
Diffstat (limited to 'drivers/unix')
-rw-r--r-- | drivers/unix/file_access_unix.cpp | 79 | ||||
-rw-r--r-- | drivers/unix/file_access_unix.h | 9 | ||||
-rw-r--r-- | drivers/unix/net_socket_posix.cpp | 20 | ||||
-rw-r--r-- | drivers/unix/net_socket_posix.h | 1 | ||||
-rw-r--r-- | drivers/unix/os_unix.cpp | 4 |
5 files changed, 102 insertions, 11 deletions
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp index 45f9f14dab..3b15cf60f7 100644 --- a/drivers/unix/file_access_unix.cpp +++ b/drivers/unix/file_access_unix.cpp @@ -108,10 +108,7 @@ Error FileAccessUnix::open_internal(const String &p_path, int p_mode_flags) { last_error = ERR_FILE_CANT_OPEN; return last_error; } - // Fix temporary file permissions (defaults to 0600 instead of 0666 & ~umask). - mode_t mask = umask(022); - umask(mask); - fchmod(fd, 0666 & ~mask); + fchmod(fd, 0666); path = String::utf8(cs.ptr()); f = fdopen(fd, mode_string); @@ -316,19 +313,19 @@ uint64_t FileAccessUnix::_get_modified_time(const String &p_file) { } } -uint32_t FileAccessUnix::_get_unix_permissions(const String &p_file) { +BitField<FileAccess::UnixPermissionFlags> FileAccessUnix::_get_unix_permissions(const String &p_file) { String file = fix_path(p_file); struct stat status = {}; int err = stat(file.utf8().get_data(), &status); if (!err) { - return status.st_mode & 0x7FF; //only permissions + return status.st_mode & 0xFFF; //only permissions } else { ERR_FAIL_V_MSG(0, "Failed to get unix permissions for: " + p_file + "."); } } -Error FileAccessUnix::_set_unix_permissions(const String &p_file, uint32_t p_permissions) { +Error FileAccessUnix::_set_unix_permissions(const String &p_file, BitField<FileAccess::UnixPermissionFlags> p_permissions) { String file = fix_path(p_file); int err = chmod(file.utf8().get_data(), p_permissions); @@ -339,6 +336,74 @@ Error FileAccessUnix::_set_unix_permissions(const String &p_file, uint32_t p_per return FAILED; } +bool FileAccessUnix::_get_hidden_attribute(const String &p_file) { +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + String file = fix_path(p_file); + + struct stat st = {}; + int err = stat(file.utf8().get_data(), &st); + ERR_FAIL_COND_V_MSG(err, false, "Failed to get attributes for: " + p_file); + + return (st.st_flags & UF_HIDDEN); +#else + return false; +#endif +} + +Error FileAccessUnix::_set_hidden_attribute(const String &p_file, bool p_hidden) { +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + String file = fix_path(p_file); + + struct stat st = {}; + int err = stat(file.utf8().get_data(), &st); + ERR_FAIL_COND_V_MSG(err, FAILED, "Failed to get attributes for: " + p_file); + + if (p_hidden) { + err = chflags(file.utf8().get_data(), st.st_flags | UF_HIDDEN); + } else { + err = chflags(file.utf8().get_data(), st.st_flags & ~UF_HIDDEN); + } + ERR_FAIL_COND_V_MSG(err, FAILED, "Failed to set attributes for: " + p_file); + return OK; +#else + return ERR_UNAVAILABLE; +#endif +} + +bool FileAccessUnix::_get_read_only_attribute(const String &p_file) { +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + String file = fix_path(p_file); + + struct stat st = {}; + int err = stat(file.utf8().get_data(), &st); + ERR_FAIL_COND_V_MSG(err, false, "Failed to get attributes for: " + p_file); + + return st.st_flags & UF_IMMUTABLE; +#else + return false; +#endif +} + +Error FileAccessUnix::_set_read_only_attribute(const String &p_file, bool p_ro) { +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) + String file = fix_path(p_file); + + struct stat st = {}; + int err = stat(file.utf8().get_data(), &st); + ERR_FAIL_COND_V_MSG(err, FAILED, "Failed to get attributes for: " + p_file); + + if (p_ro) { + err = chflags(file.utf8().get_data(), st.st_flags | UF_IMMUTABLE); + } else { + err = chflags(file.utf8().get_data(), st.st_flags & ~UF_IMMUTABLE); + } + ERR_FAIL_COND_V_MSG(err, FAILED, "Failed to set attributes for: " + p_file); + return OK; +#else + return ERR_UNAVAILABLE; +#endif +} + void FileAccessUnix::close() { _close(); } diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h index 79c4e73636..2bfac27c4f 100644 --- a/drivers/unix/file_access_unix.h +++ b/drivers/unix/file_access_unix.h @@ -79,8 +79,13 @@ public: virtual bool file_exists(const String &p_path) override; ///< return true if a file exists virtual uint64_t _get_modified_time(const String &p_file) override; - virtual uint32_t _get_unix_permissions(const String &p_file) override; - virtual Error _set_unix_permissions(const String &p_file, uint32_t p_permissions) override; + virtual BitField<FileAccess::UnixPermissionFlags> _get_unix_permissions(const String &p_file) override; + virtual Error _set_unix_permissions(const String &p_file, BitField<FileAccess::UnixPermissionFlags> p_permissions) override; + + virtual bool _get_hidden_attribute(const String &p_file) override; + virtual Error _set_hidden_attribute(const String &p_file, bool p_hidden) override; + virtual bool _get_read_only_attribute(const String &p_file) override; + virtual Error _set_read_only_attribute(const String &p_file, bool p_ro) override; virtual void close() override; diff --git a/drivers/unix/net_socket_posix.cpp b/drivers/unix/net_socket_posix.cpp index b46af012f1..a8074aa3f6 100644 --- a/drivers/unix/net_socket_posix.cpp +++ b/drivers/unix/net_socket_posix.cpp @@ -204,6 +204,9 @@ NetSocketPosix::NetError NetSocketPosix::_get_socket_error() const { if (err == WSAEACCES) { return ERR_NET_UNAUTHORIZED; } + if (err == WSAEMSGSIZE || err == WSAENOBUFS) { + return ERR_NET_BUFFER_TOO_SMALL; + } print_verbose("Socket error: " + itos(err)); return ERR_NET_OTHER; #else @@ -222,6 +225,9 @@ NetSocketPosix::NetError NetSocketPosix::_get_socket_error() const { if (errno == EACCES) { return ERR_NET_UNAUTHORIZED; } + if (errno == ENOBUFS) { + return ERR_NET_BUFFER_TOO_SMALL; + } print_verbose("Socket error: " + itos(errno)); return ERR_NET_OTHER; #endif @@ -550,6 +556,10 @@ Error NetSocketPosix::recv(uint8_t *p_buffer, int p_len, int &r_read) { return ERR_BUSY; } + if (err == ERR_NET_BUFFER_TOO_SMALL) { + return ERR_OUT_OF_MEMORY; + } + return FAILED; } @@ -571,6 +581,10 @@ Error NetSocketPosix::recvfrom(uint8_t *p_buffer, int p_len, int &r_read, IPAddr return ERR_BUSY; } + if (err == ERR_NET_BUFFER_TOO_SMALL) { + return ERR_OUT_OF_MEMORY; + } + return FAILED; } @@ -606,6 +620,9 @@ Error NetSocketPosix::send(const uint8_t *p_buffer, int p_len, int &r_sent) { if (err == ERR_NET_WOULD_BLOCK) { return ERR_BUSY; } + if (err == ERR_NET_BUFFER_TOO_SMALL) { + return ERR_OUT_OF_MEMORY; + } return FAILED; } @@ -625,6 +642,9 @@ Error NetSocketPosix::sendto(const uint8_t *p_buffer, int p_len, int &r_sent, IP if (err == ERR_NET_WOULD_BLOCK) { return ERR_BUSY; } + if (err == ERR_NET_BUFFER_TOO_SMALL) { + return ERR_OUT_OF_MEMORY; + } return FAILED; } diff --git a/drivers/unix/net_socket_posix.h b/drivers/unix/net_socket_posix.h index bd2088b4f9..2682530e15 100644 --- a/drivers/unix/net_socket_posix.h +++ b/drivers/unix/net_socket_posix.h @@ -56,6 +56,7 @@ private: ERR_NET_IN_PROGRESS, ERR_NET_ADDRESS_INVALID_OR_UNAVAILABLE, ERR_NET_UNAUTHORIZED, + ERR_NET_BUFFER_TOO_SMALL, ERR_NET_OTHER, }; diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 967699c5f3..1ffacdf98d 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -315,7 +315,7 @@ Dictionary OS_Unix::get_memory_info() const { mach_msg_type_number_t count = HOST_VM_INFO64_COUNT; vm_statistics64_data_t vmstat; if (host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info64_t)&vmstat, &count) != KERN_SUCCESS) { - ERR_PRINT(vformat("Could not get host vm statistics.")); + ERR_PRINT("Could not get host vm statistics."); } struct xsw_usage swap_used; len = sizeof(swap_used); @@ -647,7 +647,7 @@ Error OS_Unix::open_dynamic_library(const String p_path, void *&p_library_handle } p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW); - ERR_FAIL_COND_V_MSG(!p_library_handle, ERR_CANT_OPEN, "Can't open dynamic library: " + p_path + ". Error: " + dlerror()); + ERR_FAIL_COND_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) { *r_resolved_path = path; |