xref: /unit/src/nxt_dyld.c (revision 0:a63ceefd6ab0)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) NGINX, Inc.
5  */
6 
7 #include <nxt_main.h>
8 
9 
10 nxt_int_t
nxt_dyld_load(nxt_dyld_t * dyld)11 nxt_dyld_load(nxt_dyld_t *dyld)
12 {
13     const char  *err;
14 
15     dyld->handle = dlopen(dyld->name, RTLD_NOW | RTLD_GLOBAL);
16 
17     if (dyld->handle != NULL) {
18         nxt_thread_log_debug("dlopen(\"%s\")", dyld->name);
19         return NXT_OK;
20     }
21 
22     err = dlerror();
23     if (err == NULL) {
24         err = "(null)";
25     }
26 
27     nxt_thread_log_alert("dlopen(\"%s\") failed: %s", dyld->name, err);
28 
29     return NXT_ERROR;
30 }
31 
32 
33 void *
nxt_dyld_symbol(nxt_dyld_t * dyld,const char * symbol)34 nxt_dyld_symbol(nxt_dyld_t *dyld, const char *symbol)
35 {
36     void        *handle, *s;
37     const char  *name;
38     const char  *err;
39 
40     if (dyld == NXT_DYLD_ANY) {
41         handle = RTLD_DEFAULT;
42         name = "RTLD_DEFAULT";
43 
44     } else {
45         handle = dyld->handle;
46         name = dyld->name;
47     }
48 
49     s = dlsym(handle, symbol);
50 
51     if (s != NULL) {
52         nxt_thread_log_debug("dlsym(\"%s\", \"%s\")", name, symbol);
53         return s;
54     }
55 
56     err = dlerror();
57     if (err == NULL) {
58         err = "(null)";
59     }
60 
61     nxt_thread_log_alert("dlsym(\"%s\", \"%s\") failed: %s", name, symbol, err);
62 
63     return s;
64 }
65 
66 
67 nxt_int_t
nxt_dyld_unload(nxt_dyld_t * dyld)68 nxt_dyld_unload(nxt_dyld_t *dyld)
69 {
70     const char  *err;
71 
72     if (dlclose(dyld->handle) == 0) {
73         nxt_thread_log_debug("dlclose(\"%s\")", dyld->name);
74         return NXT_OK;
75     }
76 
77     err = dlerror();
78 
79     if (err == NULL) {
80         err = "(null)";
81     }
82 
83     nxt_thread_log_alert("dlclose(\"%s\") failed: %s", dyld->name, err);
84 
85     return NXT_ERROR;
86 }
87