summaryrefslogtreecommitdiffstats
path: root/drivers/unix
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/unix')
-rw-r--r--drivers/unix/file_access_unix.cpp75
-rw-r--r--drivers/unix/file_access_unix.h6
-rw-r--r--drivers/unix/os_unix.cpp19
3 files changed, 99 insertions, 1 deletions
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp
index ca5a13799e..d1e4d207e7 100644
--- a/drivers/unix/file_access_unix.cpp
+++ b/drivers/unix/file_access_unix.cpp
@@ -228,6 +228,51 @@ uint8_t FileAccessUnix::get_8() const {
return b;
}
+uint16_t FileAccessUnix::get_16() const {
+ ERR_FAIL_NULL_V_MSG(f, 0, "File must be opened before use.");
+
+ uint16_t b = 0;
+ if (fread(&b, 1, 2, f) != 2) {
+ check_errors();
+ }
+
+ if (big_endian) {
+ b = BSWAP16(b);
+ }
+
+ return b;
+}
+
+uint32_t FileAccessUnix::get_32() const {
+ ERR_FAIL_NULL_V_MSG(f, 0, "File must be opened before use.");
+
+ uint32_t b = 0;
+ if (fread(&b, 1, 4, f) != 4) {
+ check_errors();
+ }
+
+ if (big_endian) {
+ b = BSWAP32(b);
+ }
+
+ return b;
+}
+
+uint64_t FileAccessUnix::get_64() const {
+ ERR_FAIL_NULL_V_MSG(f, 0, "File must be opened before use.");
+
+ uint64_t b = 0;
+ if (fread(&b, 1, 8, f) != 8) {
+ check_errors();
+ }
+
+ if (big_endian) {
+ b = BSWAP64(b);
+ }
+
+ return b;
+}
+
uint64_t FileAccessUnix::get_buffer(uint8_t *p_dst, uint64_t p_length) const {
ERR_FAIL_COND_V(!p_dst && p_length > 0, -1);
ERR_FAIL_NULL_V_MSG(f, -1, "File must be opened before use.");
@@ -251,6 +296,36 @@ void FileAccessUnix::store_8(uint8_t p_dest) {
ERR_FAIL_COND(fwrite(&p_dest, 1, 1, f) != 1);
}
+void FileAccessUnix::store_16(uint16_t p_dest) {
+ ERR_FAIL_NULL_MSG(f, "File must be opened before use.");
+
+ if (big_endian) {
+ p_dest = BSWAP16(p_dest);
+ }
+
+ ERR_FAIL_COND(fwrite(&p_dest, 1, 2, f) != 2);
+}
+
+void FileAccessUnix::store_32(uint32_t p_dest) {
+ ERR_FAIL_NULL_MSG(f, "File must be opened before use.");
+
+ if (big_endian) {
+ p_dest = BSWAP32(p_dest);
+ }
+
+ ERR_FAIL_COND(fwrite(&p_dest, 1, 4, f) != 4);
+}
+
+void FileAccessUnix::store_64(uint64_t p_dest) {
+ ERR_FAIL_NULL_MSG(f, "File must be opened before use.");
+
+ if (big_endian) {
+ p_dest = BSWAP64(p_dest);
+ }
+
+ ERR_FAIL_COND(fwrite(&p_dest, 1, 8, f) != 8);
+}
+
void FileAccessUnix::store_buffer(const uint8_t *p_src, uint64_t p_length) {
ERR_FAIL_NULL_MSG(f, "File must be opened before use.");
ERR_FAIL_COND(!p_src && p_length > 0);
diff --git a/drivers/unix/file_access_unix.h b/drivers/unix/file_access_unix.h
index 2bfac27c4f..553fbcf355 100644
--- a/drivers/unix/file_access_unix.h
+++ b/drivers/unix/file_access_unix.h
@@ -68,12 +68,18 @@ public:
virtual bool eof_reached() const override; ///< reading passed EOF
virtual uint8_t get_8() const override; ///< get a byte
+ virtual uint16_t get_16() const override;
+ virtual uint32_t get_32() const override;
+ virtual uint64_t get_64() const override;
virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const override;
virtual Error get_error() const override; ///< get last error
virtual void flush() override;
virtual void store_8(uint8_t p_dest) override; ///< store a byte
+ virtual void store_16(uint16_t p_dest) override;
+ virtual void store_32(uint32_t p_dest) override;
+ virtual void store_64(uint64_t p_dest) override;
virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; ///< store an array of bytes
virtual bool file_exists(const String &p_path) override; ///< return true if a file exists
diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp
index 9a77930d75..51ea9234d4 100644
--- a/drivers/unix/os_unix.cpp
+++ b/drivers/unix/os_unix.cpp
@@ -656,6 +656,8 @@ 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());
}
+ ERR_FAIL_COND_V(!FileAccess::exists(path), ERR_FILE_NOT_FOUND);
+
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()));
@@ -751,12 +753,27 @@ String OS_Unix::get_executable_path() const {
return OS::get_executable_path();
}
return b;
-#elif defined(__OpenBSD__) || defined(__NetBSD__)
+#elif defined(__OpenBSD__)
char resolved_path[MAXPATHLEN];
realpath(OS::get_executable_path().utf8().get_data(), resolved_path);
return String(resolved_path);
+#elif defined(__NetBSD__)
+ int mib[4] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME };
+ char buf[MAXPATHLEN];
+ size_t len = sizeof(buf);
+ if (sysctl(mib, 4, buf, &len, nullptr, 0) != 0) {
+ WARN_PRINT("Couldn't get executable path from sysctl");
+ return OS::get_executable_path();
+ }
+
+ // NetBSD does not always return a normalized path. For example if argv[0] is "./a.out" then executable path is "/home/netbsd/./a.out". Normalize with realpath:
+ char resolved_path[MAXPATHLEN];
+
+ realpath(buf, resolved_path);
+
+ return String(resolved_path);
#elif defined(__FreeBSD__)
int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
char buf[MAXPATHLEN];