diff options
Diffstat (limited to '')
-rw-r--r-- | src/nxt_dyld.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/nxt_dyld.c b/src/nxt_dyld.c new file mode 100644 index 00000000..63e6be14 --- /dev/null +++ b/src/nxt_dyld.c @@ -0,0 +1,86 @@ + +/* + * Copyright (C) Igor Sysoev + * Copyright (C) NGINX, Inc. + */ + +#include <nxt_main.h> + + +nxt_int_t +nxt_dyld_load(nxt_dyld_t *dyld) +{ + const char *err; + + dyld->handle = dlopen(dyld->name, RTLD_NOW | RTLD_GLOBAL); + + if (dyld->handle != NULL) { + nxt_thread_log_debug("dlopen(\"%s\")", dyld->name); + return NXT_OK; + } + + err = dlerror(); + if (err == NULL) { + err = "(null)"; + } + + nxt_thread_log_alert("dlopen(\"%s\") failed: %s", dyld->name, err); + + return NXT_ERROR; +} + + +void * +nxt_dyld_symbol(nxt_dyld_t *dyld, const char *symbol) +{ + void *handle, *s; + const char *name; + const char *err; + + if (dyld == NXT_DYLD_ANY) { + handle = RTLD_DEFAULT; + name = "RTLD_DEFAULT"; + + } else { + handle = dyld->handle; + name = dyld->name; + } + + s = dlsym(handle, symbol); + + if (s != NULL) { + nxt_thread_log_debug("dlsym(\"%s\", \"%s\")", name, symbol); + return s; + } + + err = dlerror(); + if (err == NULL) { + err = "(null)"; + } + + nxt_thread_log_alert("dlsym(\"%s\", \"%s\") failed: %s", name, symbol, err); + + return s; +} + + +nxt_int_t +nxt_dyld_unload(nxt_dyld_t *dyld) +{ + const char *err; + + if (dlclose(dyld->handle) == 0) { + nxt_thread_log_debug("dlclose(\"%s\")", dyld->name); + return NXT_OK; + } + + err = dlerror(); + + if (err == NULL) { + err = "(null)"; + } + + nxt_thread_log_alert("dlclose(\"%s\") failed: %s", dyld->name, err); + + return NXT_ERROR; +} |