summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorqiuyiuestc <[email protected]>2010-12-20 15:42:54 +0000
committerqiuyiuestc <[email protected]>2010-12-20 15:42:54 +0000
commit32d13198df15cfed5164ed510073b4f9a1a6181e (patch)
tree14598aa3d48cc7516aaa9db478deb833defdbe96 /components
parentf18a82d59b3ccf0b9eaf821d03c865bcbd45dc36 (diff)
update dlopen implement
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1219 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components')
-rw-r--r--components/libdl/dlopen.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/components/libdl/dlopen.c b/components/libdl/dlopen.c
index 00405523e4..f31623083f 100644
--- a/components/libdl/dlopen.c
+++ b/components/libdl/dlopen.c
@@ -15,24 +15,34 @@
#include <rtthread.h>
#include <rtm.h>
+#define MODULE_ROOT_DIR "/module"
+
void* dlopen(const char *filename, int flags)
{
rt_module_t module;
-
+ char *fullpath;
+ const char*def_path = MODULE_ROOT_DIR;
+
+ /* check parameters */
RT_ASSERT(filename != RT_NULL);
+ if (filename[0] != '/') /* it's a absolute path, use it directly */
+ {
+ fullpath = rt_malloc(strlen(def_path) + strlen(filename) + 2);
+
+ /* join path and file name */
+ rt_snprintf(fullpath, strlen(def_path) + strlen(filename) + 2,
+ "%s/%s", def_path, filename);
+ }
+
/* find in module list */
- module = rt_module_find(filename);
+ module = rt_module_find(fullpath);
- if(module)
- {
- module->nref++;
- return (void*)module;
- }
- else
- {
- module = rt_module_open(filename);
- }
+ if(module != RT_NULL) module->nref++;
+ else module = rt_module_open(fullpath);
+
+ rt_free(fullpath);
+ return (void*)module;
}
RTM_EXPORT(dlopen)