libfreerdp-utils: improve freerdp_load_plugin
This commit is contained in:
parent
bffda2747b
commit
aaaafcc4b7
@ -1,5 +1,5 @@
|
|||||||
option(WITH_DEBUG_TRANSPORT "Print transport debug messages." OFF)
|
option(WITH_DEBUG_TRANSPORT "Print transport debug messages." OFF)
|
||||||
option(WITH_DEBUG_CHANMAN "Print channel manager debug messages." OFF)
|
option(WITH_DEBUG_CHANNELS "Print channel manager debug messages." OFF)
|
||||||
option(WITH_DEBUG_SVC "Print static virtual channel debug messages." OFF)
|
option(WITH_DEBUG_SVC "Print static virtual channel debug messages." OFF)
|
||||||
option(WITH_DEBUG_DVC "Print dynamic virtual channel debug messages." OFF)
|
option(WITH_DEBUG_DVC "Print dynamic virtual channel debug messages." OFF)
|
||||||
option(WITH_DEBUG_KBD "Print keyboard related debug messages." OFF)
|
option(WITH_DEBUG_KBD "Print keyboard related debug messages." OFF)
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
/* Options */
|
/* Options */
|
||||||
#cmakedefine WITH_DEBUG_TRANSPORT
|
#cmakedefine WITH_DEBUG_TRANSPORT
|
||||||
#cmakedefine WITH_DEBUG_CHANMAN
|
#cmakedefine WITH_DEBUG_CHANNELS
|
||||||
#cmakedefine WITH_DEBUG_SVC
|
#cmakedefine WITH_DEBUG_SVC
|
||||||
#cmakedefine WITH_DEBUG_DVC
|
#cmakedefine WITH_DEBUG_DVC
|
||||||
#cmakedefine WITH_DEBUG_KBD
|
#cmakedefine WITH_DEBUG_KBD
|
||||||
|
@ -30,7 +30,9 @@ FREERDP_API char* freerdp_get_home_path(rdpSettings* settings);
|
|||||||
FREERDP_API char* freerdp_get_config_path(rdpSettings* settings);
|
FREERDP_API char* freerdp_get_config_path(rdpSettings* settings);
|
||||||
FREERDP_API char* freerdp_get_current_path(rdpSettings* settings);
|
FREERDP_API char* freerdp_get_current_path(rdpSettings* settings);
|
||||||
FREERDP_API char* freerdp_construct_path(char* base_path, char* relative_path);
|
FREERDP_API char* freerdp_construct_path(char* base_path, char* relative_path);
|
||||||
|
FREERDP_API char* freerdp_append_shared_library_suffix(char* file_path);
|
||||||
FREERDP_API char* freerdp_get_parent_path(char* base_path, int depth);
|
FREERDP_API char* freerdp_get_parent_path(char* base_path, int depth);
|
||||||
|
FREERDP_API boolean freerdp_path_contains_separator(char* path);
|
||||||
FREERDP_API boolean freerdp_detect_development_mode(rdpSettings* settings);
|
FREERDP_API boolean freerdp_detect_development_mode(rdpSettings* settings);
|
||||||
FREERDP_API void freerdp_detect_paths(rdpSettings* settings);
|
FREERDP_API void freerdp_detect_paths(rdpSettings* settings);
|
||||||
|
|
||||||
|
@ -683,7 +683,7 @@ int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings, c
|
|||||||
}
|
}
|
||||||
|
|
||||||
lib = channels->libs_data + channels->num_libs_data;
|
lib = channels->libs_data + channels->num_libs_data;
|
||||||
lib->entry = (PVIRTUALCHANNELENTRY)freerdp_load_plugin(name, CHANNEL_EXPORT_FUNC_NAME);
|
lib->entry = (PVIRTUALCHANNELENTRY) freerdp_load_plugin(name, CHANNEL_EXPORT_FUNC_NAME);
|
||||||
|
|
||||||
if (lib->entry == NULL)
|
if (lib->entry == NULL)
|
||||||
{
|
{
|
||||||
@ -705,9 +705,11 @@ int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings, c
|
|||||||
channels->settings = settings;
|
channels->settings = settings;
|
||||||
|
|
||||||
freerdp_mutex_lock(g_mutex_init);
|
freerdp_mutex_lock(g_mutex_init);
|
||||||
|
|
||||||
g_init_channels = channels;
|
g_init_channels = channels;
|
||||||
ok = lib->entry((PCHANNEL_ENTRY_POINTS)&ep);
|
ok = lib->entry((PCHANNEL_ENTRY_POINTS) &ep);
|
||||||
g_init_channels = NULL;
|
g_init_channels = NULL;
|
||||||
|
|
||||||
freerdp_mutex_unlock(g_mutex_init);
|
freerdp_mutex_unlock(g_mutex_init);
|
||||||
|
|
||||||
/* disable MyVirtualChannelInit */
|
/* disable MyVirtualChannelInit */
|
||||||
|
@ -47,6 +47,14 @@
|
|||||||
#define HOME_ENV_VARIABLE "HOMEPATH"
|
#define HOME_ENV_VARIABLE "HOMEPATH"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define SHARED_LIB_SUFFIX ".dll"
|
||||||
|
#elif __APPLE__
|
||||||
|
#define SHARED_LIB_SUFFIX ".dylib"
|
||||||
|
#else
|
||||||
|
#define SHARED_LIB_SUFFIX ".so"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define FREERDP_CONFIG_DIR ".freerdp"
|
#define FREERDP_CONFIG_DIR ".freerdp"
|
||||||
|
|
||||||
#define PARENT_PATH ".." PATH_SEPARATOR_STR
|
#define PARENT_PATH ".." PATH_SEPARATOR_STR
|
||||||
@ -118,6 +126,41 @@ char* freerdp_construct_path(char* base_path, char* relative_path)
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* freerdp_append_shared_library_suffix(char* file_path)
|
||||||
|
{
|
||||||
|
char* p;
|
||||||
|
char* path = NULL;
|
||||||
|
int file_path_length;
|
||||||
|
int shared_lib_suffix_length;
|
||||||
|
|
||||||
|
if (file_path == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
file_path_length = strlen(file_path);
|
||||||
|
shared_lib_suffix_length = strlen(SHARED_LIB_SUFFIX);
|
||||||
|
|
||||||
|
if (file_path_length >= shared_lib_suffix_length)
|
||||||
|
{
|
||||||
|
p = &file_path[file_path_length - shared_lib_suffix_length];
|
||||||
|
|
||||||
|
if (strcmp(p, SHARED_LIB_SUFFIX) != 0)
|
||||||
|
{
|
||||||
|
path = xmalloc(file_path_length + shared_lib_suffix_length + 1);
|
||||||
|
sprintf(path, "%s%s", file_path, SHARED_LIB_SUFFIX);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
path = xstrdup(file_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
path = xstrdup(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
char* freerdp_get_parent_path(char* base_path, int depth)
|
char* freerdp_get_parent_path(char* base_path, int depth)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -154,6 +197,17 @@ char* freerdp_get_parent_path(char* base_path, int depth)
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean freerdp_path_contains_separator(char* path)
|
||||||
|
{
|
||||||
|
if (path == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (strchr(path, PATH_SEPARATOR_CHR) == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* detects if we are running from the source tree */
|
/* detects if we are running from the source tree */
|
||||||
|
|
||||||
boolean freerdp_detect_development_mode(rdpSettings* settings)
|
boolean freerdp_detect_development_mode(rdpSettings* settings)
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <freerdp/utils/file.h>
|
||||||
#include <freerdp/utils/print.h>
|
#include <freerdp/utils/print.h>
|
||||||
|
#include <freerdp/utils/memory.h>
|
||||||
#include <freerdp/utils/load_plugin.h>
|
#include <freerdp/utils/load_plugin.h>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -30,8 +32,6 @@
|
|||||||
#define DLSYM(f, n) GetProcAddress(f, n)
|
#define DLSYM(f, n) GetProcAddress(f, n)
|
||||||
#define DLCLOSE(f) FreeLibrary(f)
|
#define DLCLOSE(f) FreeLibrary(f)
|
||||||
#define DLERROR() ""
|
#define DLERROR() ""
|
||||||
#define PATH_SEPARATOR '\\'
|
|
||||||
#define PLUGIN_EXT "dll"
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -41,38 +41,51 @@
|
|||||||
#define DLSYM(f, n) dlsym(f, n)
|
#define DLSYM(f, n) dlsym(f, n)
|
||||||
#define DLCLOSE(f) dlclose(f)
|
#define DLCLOSE(f) dlclose(f)
|
||||||
#define DLERROR() dlerror()
|
#define DLERROR() dlerror()
|
||||||
#define PATH_SEPARATOR '/'
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
#define PLUGIN_EXT "dylib"
|
|
||||||
#else
|
|
||||||
#define PLUGIN_EXT "so"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void* freerdp_load_plugin(const char* name, const char* entry_name)
|
void* freerdp_load_plugin(const char* name, const char* entry_name)
|
||||||
{
|
{
|
||||||
char path[255];
|
char* path;
|
||||||
void* module;
|
void* module;
|
||||||
void* entry;
|
void* entry;
|
||||||
|
char* suffixed_name;
|
||||||
|
|
||||||
if (strchr(name, PATH_SEPARATOR) == NULL)
|
suffixed_name = freerdp_append_shared_library_suffix((char*) name);
|
||||||
snprintf(path, sizeof(path), PLUGIN_PATH "%c%s." PLUGIN_EXT, PATH_SEPARATOR, name);
|
|
||||||
|
if (!freerdp_path_contains_separator(suffixed_name))
|
||||||
|
{
|
||||||
|
/* no explicit path given, use default path */
|
||||||
|
path = freerdp_construct_path(PLUGIN_PATH, suffixed_name);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
strncpy(path, name, sizeof(path));
|
{
|
||||||
|
/* explicit path given, use it instead of default path */
|
||||||
|
path = xstrdup(suffixed_name);
|
||||||
|
}
|
||||||
|
|
||||||
module = DLOPEN(path);
|
module = DLOPEN(path);
|
||||||
|
|
||||||
if (module == NULL)
|
if (module == NULL)
|
||||||
{
|
{
|
||||||
printf("freerdp_load_plugin: failed to open %s: %s\n", path, DLERROR());
|
printf("freerdp_load_plugin: failed to open %s: %s\n", path, DLERROR());
|
||||||
|
xfree(suffixed_name);
|
||||||
|
xfree(path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = DLSYM(module, entry_name);
|
entry = DLSYM(module, entry_name);
|
||||||
|
|
||||||
if (entry == NULL)
|
if (entry == NULL)
|
||||||
{
|
{
|
||||||
printf("freerdp_load_plugin: failed to load %s: %s\n", path, DLERROR());
|
printf("freerdp_load_plugin: failed to load %s: %s\n", path, DLERROR());
|
||||||
|
xfree(suffixed_name);
|
||||||
|
xfree(path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xfree(suffixed_name);
|
||||||
|
xfree(path);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user