aboutsummaryrefslogtreecommitdiff
path: root/core/dynlib
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-01-06 01:52:23 +0100
committerLaytan Laats <laytanlaats@hotmail.com>2024-01-06 02:08:11 +0100
commit85b71708dd715c878637da317fad748769e595d6 (patch)
tree5a21dd83427bd8b79a3a9a0df19d1c20492c14c0 /core/dynlib
parent649b5fa528834a973c19a0624025970946bc6fd0 (diff)
dynlib: add last_error procedure
Diffstat (limited to 'core/dynlib')
-rw-r--r--core/dynlib/lib.odin19
-rw-r--r--core/dynlib/lib_js.odin4
-rw-r--r--core/dynlib/lib_unix.odin5
-rw-r--r--core/dynlib/lib_windows.odin7
4 files changed, 33 insertions, 2 deletions
diff --git a/core/dynlib/lib.odin b/core/dynlib/lib.odin
index 183ddd724..6a5c919a3 100644
--- a/core/dynlib/lib.odin
+++ b/core/dynlib/lib.odin
@@ -34,6 +34,7 @@ Example:
LIBRARY_PATH :: "my_library.dll"
library, ok := dynlib.load_library(LIBRARY_PATH)
if ! ok {
+ fmt.eprintln(dynlib.last_error())
return
}
fmt.println("The library %q was successfully loaded", LIBRARY_PATH)
@@ -58,10 +59,12 @@ Example:
LIBRARY_PATH :: "my_library.dll"
library, ok := dynlib.load_library(LIBRARY_PATH)
if ! ok {
+ fmt.eprintln(dynlib.last_error())
return
}
did_unload := dynlib.unload_library(library)
if ! did_unload {
+ fmt.eprintln(dynlib.last_error())
return
}
fmt.println("The library %q was successfully unloaded", LIBRARY_PATH)
@@ -89,11 +92,16 @@ Example:
LIBRARY_PATH :: "my_library.dll"
library, ok := dynlib.load_library(LIBRARY_PATH)
if ! ok {
+ fmt.eprintln(dynlib.last_error())
return
}
a, found_a := dynlib.symbol_address(library, "a")
- if found_a do fmt.printf("The symbol %q was found at the address %v", "a", a)
+ if found_a {
+ fmt.printf("The symbol %q was found at the address %v", "a", a)
+ } else {
+ fmt.eprintln(dynlib.last_error())
+ }
}
*/
symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) #optional_ok {
@@ -166,4 +174,11 @@ initialize_symbols :: proc(symbol_table: ^$T, library_name: string, symbol_prefi
}
}
return count, count > 0
-} \ No newline at end of file
+}
+
+/*
+Returns an error message for the last failed procedure call.
+*/
+last_error :: proc() -> string {
+ return _last_error()
+}
diff --git a/core/dynlib/lib_js.odin b/core/dynlib/lib_js.odin
index ace1b0939..866874ee8 100644
--- a/core/dynlib/lib_js.odin
+++ b/core/dynlib/lib_js.odin
@@ -13,3 +13,7 @@ _unload_library :: proc(library: Library) -> bool {
_symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) {
return nil, false
}
+
+_last_error :: proc() -> string {
+ return ""
+}
diff --git a/core/dynlib/lib_unix.odin b/core/dynlib/lib_unix.odin
index b0cc37e99..97f70b576 100644
--- a/core/dynlib/lib_unix.odin
+++ b/core/dynlib/lib_unix.odin
@@ -22,3 +22,8 @@ _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found
found = ptr != nil
return
}
+
+_last_error :: proc() -> string {
+ err := os.dlerror()
+ return "unknown" if err == "" else err
+}
diff --git a/core/dynlib/lib_windows.odin b/core/dynlib/lib_windows.odin
index 67880df4b..9a1b5f998 100644
--- a/core/dynlib/lib_windows.odin
+++ b/core/dynlib/lib_windows.odin
@@ -5,6 +5,7 @@ package dynlib
import win32 "core:sys/windows"
import "core:strings"
import "core:runtime"
+import "core:reflect"
_load_library :: proc(path: string, global_symbols := false) -> (Library, bool) {
// NOTE(bill): 'global_symbols' is here only for consistency with POSIX which has RTLD_GLOBAL
@@ -27,3 +28,9 @@ _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found
found = ptr != nil
return
}
+
+_last_error :: proc() -> string {
+ err := win32.System_Error(win32.GetLastError())
+ err_msg := reflect.enum_string(err)
+ return "unknown" if err_msg == "" else err_msg
+}