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*10465441SEvalZerovoid* 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