65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 2006-2018, 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);
 |