65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |  * Copyright (c) 2006-2021, RT-Thread Development Team | ||
|  |  * | ||
|  |  * SPDX-License-Identifier: Apache-2.0 | ||
|  |  * | ||
|  |  * Change Logs: | ||
|  |  * Date           Author        Notes | ||
|  |  * 2010-11-17      yi.qiu   first version | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <rtthread.h>
 | ||
|  | #include <rtm.h>
 | ||
|  | #include <string.h>
 | ||
|  | 
 | ||
|  | #include "dlmodule.h"
 | ||
|  | 
 | ||
|  | #define MODULE_ROOT_DIR     "/modules"
 | ||
|  | 
 | ||
|  | void* dlopen(const char *filename, int flags) | ||
|  | { | ||
|  |     struct rt_dlmodule *module; | ||
|  |     char *fullpath; | ||
|  |     const char*def_path = MODULE_ROOT_DIR; | ||
|  | 
 | ||
|  |     /* check parameters */ | ||
|  |     RT_ASSERT(filename != RT_NULL); | ||
|  | 
 | ||
|  |     if (filename[0] != '/') /* it's a relative path, prefix with MODULE_ROOT_DIR */ | ||
|  |     { | ||
|  |         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); | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         fullpath = (char*)filename; /* absolute path, use it directly */ | ||
|  |     } | ||
|  | 
 | ||
|  |     rt_enter_critical(); | ||
|  | 
 | ||
|  |     /* find in module list */ | ||
|  |     module = dlmodule_find(fullpath); | ||
|  | 
 | ||
|  |     if(module != RT_NULL) | ||
|  |     { | ||
|  |         rt_exit_critical(); | ||
|  |         module->nref++; | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         rt_exit_critical(); | ||
|  |         module = dlmodule_load(fullpath); | ||
|  |     } | ||
|  | 
 | ||
|  |     if(fullpath != filename) | ||
|  |     { | ||
|  |         rt_free(fullpath); | ||
|  |     } | ||
|  | 
 | ||
|  |     return (void*)module; | ||
|  | } | ||
|  | RTM_EXPORT(dlopen); |