• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef	_DLFCN_H
2 #define	_DLFCN_H
3 
4 #include <features.h>
5 #include <stdbool.h>
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 #define RTLD_LAZY   1
12 #define RTLD_NOW    2
13 #define RTLD_NOLOAD 4
14 #define RTLD_NODELETE 4096
15 #define RTLD_GLOBAL 256
16 #define RTLD_LOCAL  0
17 
18 #define RTLD_NEXT    ((void *)-1)
19 #define RTLD_DEFAULT ((void *)0)
20 
21 #define RTLD_DI_LINKMAP 2
22 
23 
24 /* create flags for dlns_create */
25 #define CREATE_INHERIT_DEFAULT 0x1
26 #define CREATE_INHERIT_CURRENT 0x2
27 #define LOCAL_NS_PREFERED 0x4 /* Use app's library when app's library has same name as system library. */
28 
29 int    dlclose(void *);
30 char  *dlerror(void);
31 void  *dlopen(const char *, int);
32 void  *dlsym(void *__restrict, const char *__restrict);
33 void  *dlvsym(void *__restrict, const char *__restrict, const char *__restrict);
34 
35 /* namespace apis */
36 #define NS_NAME_MAX 255
37 typedef struct {
38 	char name[NS_NAME_MAX+1];
39 } Dl_namespace;
40 
41 /**
42   * @brief Initialize a namespace structure for operating namespaces through related functional interfaces.
43   * @param Dl_namespace * namespace handle.
44   * @param char * namespace name.
45   * @return void.
46   * @retval none.
47   */
48 void dlns_init(Dl_namespace *, const char *);
49 
50 /**
51   * @brief Gets the current namespace handle, or verifies that the given name namespace exists.
52   * @param char * Namespace name.Gets the current caller namespace handle when name is null.
53   * @param Dl_namespace * namespace handle.
54   * @return return 0 on success,fail other values.
55   * @retval
56   *    EINVAL(22) Invalid argument.
57   *    ENOKEY(126) Required key not available.
58   */
59 int dlns_get(const char *, Dl_namespace *);
60 
61 /**
62   * @brief open dso in given namespace which has own lib search paths, when namespace is null, it's same to dlopen().
63   *        avoid using "default" as namespace, which is the default namespace.
64   * @param Dl_namespace * namespace handle.
65   * @param char * the name of the so file you want to open.
66   * @param int open file mode.
67   *    -- RTLD_LAZY.
68   *    -- RTLD_NOW.
69   *    -- RTLD_NOLOAD.
70   *    -- RTLD_NODELETE.
71   *    -- RTLD_GLOBAL.
72   *    -- RTLD_LOCAL.
73   * @return success: dynamic library handleoid,failed: NULL.
74   * @retval none.
75   */
76 void *dlopen_ns(Dl_namespace *, const char *, int);
77 
78 /**
79   * @brief create the namespace and set lib search paths of namespace,
80   *        the paths should be splited by ':'. When namespace already exist,return error.
81   *        avoid using "default" as namespace, which is the default namespace.
82   * @param Dl_namespace * namespace handle.
83   * @param char * lib path library that can be specified.
84   * @return return 0 on success,fail other values.
85   * @retval
86   *    EINVAL(22) Invalid argument.
87   *    EEXIST(17) File exists.
88   *    ENOMEM(12) Out of memory.
89   */
90 int dlns_create(Dl_namespace *, const char *);
91 
92 /**
93   * @brief create the namespace and set lib search paths of namespace,
94   *        like dlns_create, except can use flags to set parent ns.
95   * @param Dl_namespace * namespace handle.
96   * @param char * lib path library that can be specified.
97   * #param int flags for create namespace, CREATE_INHERIT_CURRENT or CREATE_INHERIT_DEFAULT.
98   * @return return 0 on success,fail other values.
99   * @retval
100   *    EINVAL(22) Invalid argument.
101   *    EEXIST(17) File exists.
102   *    ENOMEM(12) Out of memory.
103   */
104 int dlns_create2(Dl_namespace *, const char *, int);
105 
106 /**
107   * @brief make one namespace inherit another, and so it can use shared libs by the inherited one.
108   *        param1: namespace, param2: inherited namespace, param3: shared libs.
109   *        the shared libs should be splited by ':'. when it is null or empty, all libs can be shared.
110   *        one namespace can inherit or be inherited by multiple ones.
111   *        When namespaces do not exist, return error.
112   * @param Dl_namespace * The first parameter is the namespace to inherit from.
113   * @param Dl_namespace * The second parameter is the inherited namespace.
114   * @param char * some library names to inherit.
115   * @return return 0 on success,fail other values.
116   * @retval
117   *    EINVAL(22) Invalid argument.
118   *    ENOKEY(126) Required key not available.
119   */
120 int dlns_inherit(Dl_namespace *, Dl_namespace *, const char *);
121 
122 /**
123   * @brief Set namespace lib_path.
124   * @param name namespace name.
125   * @param lib_path The lib path name that needs to be reset, it can be multiple, link with ":".
126   * @return Returns 0 on success, other on failure.
127   * @retval
128   *    EINVAL(22) Invalid argument.
129   *    ENOKEY(126) Required key not available.
130   */
131 int dlns_set_namespace_lib_path(const char *name, const char *lib_path);
132 
133 /**
134   * @brief Set namespace separated.
135   * @param name namespace name.
136   * @param separated separated.
137   * @return Returns 0 on success, other on failure.
138   * @retval
139   *    EINVAL(22) Invalid argument.
140   *    ENOKEY(126) Required key not available.
141   */
142 int dlns_set_namespace_separated(const char *name, const bool separated);
143 
144 /**
145   * @brief Set namespace permitted_paths.
146   * @param name namespace name.
147   * @param permitted_paths set new permitted_paths.
148   * @return Returns 0 on success, other on failure.
149   * @retval
150   *    EINVAL(22) Invalid argument.
151   *    ENOKEY(126) Required key not available.
152   */
153 int dlns_set_namespace_permitted_paths(const char *name, const char *permitted_paths);
154 
155 /**
156   * @brief Set namespace allowed_libs.
157   * @param name namespace name.
158   * @param allowed_libs set new allowed_libs.
159   * @return Returns 0 on success, other on failure.
160   * @retval
161   *    EINVAL(22) Invalid argument.
162   *    ENOKEY(126) Required key not available.
163   */
164 int dlns_set_namespace_allowed_libs(const char *name, const char *allowed_libs);
165 
166 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
167 typedef struct {
168 	const char *dli_fname;
169 	void *dli_fbase;
170 	const char *dli_sname;
171 	void *dli_saddr;
172 } Dl_info;
173 int dladdr(const void *, Dl_info *);
174 int dlinfo(void *, int, void *);
175 #endif
176 
177 #if _REDIR_TIME64
178 __REDIR(dlsym, __dlsym_time64);
179 #endif
180 
181 #ifdef __cplusplus
182 }
183 #endif
184 
185 #endif
186