Initial version.
This commit is contained in:
86
src/nxt_dyld.c
Normal file
86
src/nxt_dyld.c
Normal file
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user