xref: /nrf52832-nimble/rt-thread/components/libc/libdl/dlopen.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author        Notes
8*10465441SEvalZero  * 2010-11-17      yi.qiu   first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rtthread.h>
12*10465441SEvalZero #include <rtm.h>
13*10465441SEvalZero #include <string.h>
14*10465441SEvalZero 
15*10465441SEvalZero #include "dlmodule.h"
16*10465441SEvalZero 
17*10465441SEvalZero #define MODULE_ROOT_DIR     "/modules"
18*10465441SEvalZero 
dlopen(const char * filename,int flags)19*10465441SEvalZero void* dlopen(const char *filename, int flags)
20*10465441SEvalZero {
21*10465441SEvalZero     struct rt_dlmodule *module;
22*10465441SEvalZero     char *fullpath;
23*10465441SEvalZero     const char*def_path = MODULE_ROOT_DIR;
24*10465441SEvalZero 
25*10465441SEvalZero     /* check parameters */
26*10465441SEvalZero     RT_ASSERT(filename != RT_NULL);
27*10465441SEvalZero 
28*10465441SEvalZero     if (filename[0] != '/') /* it's a relative path, prefix with MODULE_ROOT_DIR */
29*10465441SEvalZero     {
30*10465441SEvalZero         fullpath = rt_malloc(strlen(def_path) + strlen(filename) + 2);
31*10465441SEvalZero 
32*10465441SEvalZero         /* join path and file name */
33*10465441SEvalZero         rt_snprintf(fullpath, strlen(def_path) + strlen(filename) + 2,
34*10465441SEvalZero             "%s/%s", def_path, filename);
35*10465441SEvalZero     }
36*10465441SEvalZero     else
37*10465441SEvalZero     {
38*10465441SEvalZero         fullpath = (char*)filename; /* absolute path, use it directly */
39*10465441SEvalZero     }
40*10465441SEvalZero 
41*10465441SEvalZero     rt_enter_critical();
42*10465441SEvalZero 
43*10465441SEvalZero     /* find in module list */
44*10465441SEvalZero     module = dlmodule_find(fullpath);
45*10465441SEvalZero 
46*10465441SEvalZero     if(module != RT_NULL)
47*10465441SEvalZero     {
48*10465441SEvalZero         rt_exit_critical();
49*10465441SEvalZero         module->nref++;
50*10465441SEvalZero     }
51*10465441SEvalZero     else
52*10465441SEvalZero     {
53*10465441SEvalZero         rt_exit_critical();
54*10465441SEvalZero         module = dlmodule_load(fullpath);
55*10465441SEvalZero     }
56*10465441SEvalZero 
57*10465441SEvalZero     if(fullpath != filename)
58*10465441SEvalZero     {
59*10465441SEvalZero         rt_free(fullpath);
60*10465441SEvalZero     }
61*10465441SEvalZero 
62*10465441SEvalZero     return (void*)module;
63*10465441SEvalZero }
64*10465441SEvalZero RTM_EXPORT(dlopen);
65