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