From cb69657b81d2db26312ea32d887a28d6822d3648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 5 Oct 2012 16:01:59 -0400 Subject: [PATCH] channels: refactoring of rdpdr cmake scripts --- channels/client/CMakeLists.txt | 32 ++++ channels/client/loader.c | 20 +++ channels/rdpdr/client/parallel/CMakeLists.txt | 21 +-- channels/rdpdr/client/printer/CMakeLists.txt | 28 +-- .../rdpdr/client/smartcard/CMakeLists.txt | 24 +-- client/Windows/wfreerdp.c | 6 +- libfreerdp/channels/libchannels.c | 4 +- libfreerdp/utils/load_plugin.c | 167 +----------------- libfreerdp/utils/svc_plugin.c | 3 +- 9 files changed, 104 insertions(+), 201 deletions(-) create mode 100644 channels/client/CMakeLists.txt create mode 100644 channels/client/loader.c diff --git a/channels/client/CMakeLists.txt b/channels/client/CMakeLists.txt new file mode 100644 index 000000000..f628bd0b1 --- /dev/null +++ b/channels/client/CMakeLists.txt @@ -0,0 +1,32 @@ +# FreeRDP: A Remote Desktop Protocol Client +# FreeRDP cmake build script +# +# Copyright 2012 Marc-Andre Moreau +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(MODULE_NAME "freerdp-channels-client") +set(MODULE_PREFIX "FREERDP_CHANNELS_CLIENT") + +set(${MODULE_PREFIX}_SRCS + loader.c) + +add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) + +set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION_FULL} SOVERSION ${FREERDP_VERSION} PREFIX "lib") + +target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Channels/Client") + diff --git a/channels/client/loader.c b/channels/client/loader.c new file mode 100644 index 000000000..b3513115f --- /dev/null +++ b/channels/client/loader.c @@ -0,0 +1,20 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Client Channel Loader + * + * Copyright 2012 Marc-Andre Moreau + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + diff --git a/channels/rdpdr/client/parallel/CMakeLists.txt b/channels/rdpdr/client/parallel/CMakeLists.txt index 024f12995..0df901638 100644 --- a/channels/rdpdr/client/parallel/CMakeLists.txt +++ b/channels/rdpdr/client/parallel/CMakeLists.txt @@ -1,9 +1,7 @@ # FreeRDP: A Remote Desktop Protocol Client # FreeRDP cmake build script # -# Copyright 2011 O.S. Systems Software Ltda. -# Copyright 2011 Otavio Salvador -# Copyright 2011 Marc-Andre Moreau +# Copyright 2012 Marc-Andre Moreau # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,19 +15,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(PARALLEL_SRCS - parallel_main.c -) +set(MODULE_NAME "parallel") +set(MODULE_PREFIX "CHANNEL_PARALLEL_CLIENT") + +set(${MODULE_PREFIX}_SRCS + parallel_main.c) include_directories(..) -add_library(parallel ${PARALLEL_SRCS}) -set_target_properties(parallel PROPERTIES PREFIX "") +add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) + +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") if(WITH_MONOLITHIC_BUILD) - target_link_libraries(parallel freerdp) + target_link_libraries(${MODULE_NAME} freerdp) else() - target_link_libraries(parallel freerdp-utils) + target_link_libraries(${MODULE_NAME} freerdp-utils winpr-interlocked) endif() install(TARGETS parallel DESTINATION ${FREERDP_PLUGIN_PATH}) diff --git a/channels/rdpdr/client/printer/CMakeLists.txt b/channels/rdpdr/client/printer/CMakeLists.txt index 8dbfc7bac..36c3b59ee 100644 --- a/channels/rdpdr/client/printer/CMakeLists.txt +++ b/channels/rdpdr/client/printer/CMakeLists.txt @@ -1,9 +1,7 @@ # FreeRDP: A Remote Desktop Protocol Client # FreeRDP cmake build script # -# Copyright 2011 O.S. Systems Software Ltda. -# Copyright 2011 Otavio Salvador -# Copyright 2011 Marc-Andre Moreau +# Copyright 2012 Marc-Andre Moreau # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,13 +15,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(PRINTER_SRCS +set(MODULE_NAME "printer") +set(MODULE_PREFIX "CHANNEL_PRINTER_CLIENT") + +set(${MODULE_PREFIX}_SRCS printer_main.c printer_main.h) if(WITH_CUPS) - set(PRINTER_SRCS - ${PRINTER_SRCS} + set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} printer_cups.c printer_cups.h) @@ -32,25 +32,25 @@ if(WITH_CUPS) endif() if(WIN32) - set(PRINTER_SRCS - ${PRINTER_SRCS} + set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} printer_win.c printer_win.h) endif() include_directories(..) -add_library(printer ${PRINTER_SRCS}) -set_target_properties(printer PROPERTIES PREFIX "") +add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) + +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") if(WITH_MONOLITHIC_BUILD) - target_link_libraries(printer freerdp winpr) + target_link_libraries(${MODULE_NAME} freerdp winpr) else() - target_link_libraries(printer freerdp-utils winpr-crt winpr-synch winpr-thread winpr-interlocked) + target_link_libraries(${MODULE_NAME} freerdp-utils winpr-crt winpr-synch winpr-thread winpr-interlocked) endif() if(WITH_CUPS) - target_link_libraries(printer ${CUPS_LIBRARIES}) + target_link_libraries(${MODULE_NAME} ${CUPS_LIBRARIES}) endif() -install(TARGETS printer DESTINATION ${FREERDP_PLUGIN_PATH}) +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) diff --git a/channels/rdpdr/client/smartcard/CMakeLists.txt b/channels/rdpdr/client/smartcard/CMakeLists.txt index 7a8717a0a..55b985e5a 100644 --- a/channels/rdpdr/client/smartcard/CMakeLists.txt +++ b/channels/rdpdr/client/smartcard/CMakeLists.txt @@ -1,9 +1,7 @@ # FreeRDP: A Remote Desktop Protocol Client # FreeRDP cmake build script # -# Copyright 2011 O.S. Systems Software Ltda. -# Copyright 2011 Otavio Salvador -# Copyright 2011 Marc-Andre Moreau +# Copyright 2012 Marc-Andre Moreau # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,23 +15,25 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(SCARD_SRCS +set(MODULE_NAME "smartcard") +set(MODULE_PREFIX "CHANNEL_PRINTER_CLIENT") + +set(${MODULE_PREFIX}_SRCS scard_main.c - scard_operations.c -) + scard_operations.c) include_directories(..) include_directories(${PCSC_INCLUDE_DIRS}) -add_library(scard ${SCARD_SRCS}) -set_target_properties(scard PROPERTIES PREFIX "") +add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) +set_target_properties(${MODULE_NAME} PROPERTIES PREFIX "") if(WITH_MONOLITHIC_BUILD) - target_link_libraries(scard freerdp winpr) + target_link_libraries(${MODULE_NAME} freerdp winpr) else() - target_link_libraries(scard freerdp-utils winpr-crt winpr-synch winpr-thread winpr-interlocked) + target_link_libraries(${MODULE_NAME} freerdp-utils winpr-crt winpr-synch winpr-thread winpr-interlocked) endif() -target_link_libraries(scard ${PCSC_LIBRARIES}) +target_link_libraries(${MODULE_NAME} ${PCSC_LIBRARIES}) -install(TARGETS scard DESTINATION ${FREERDP_PLUGIN_PATH}) +install(TARGETS ${MODULE_NAME} DESTINATION ${FREERDP_PLUGIN_PATH}) diff --git a/client/Windows/wfreerdp.c b/client/Windows/wfreerdp.c index 60aae23c2..f0c3a7c53 100644 --- a/client/Windows/wfreerdp.c +++ b/client/Windows/wfreerdp.c @@ -702,9 +702,9 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine instance->context->argv = __argv; #ifdef WITH_RDPDR - REGISTER_SVC_PLUGIN_ENTRY(rdpdr) ; - REGISTER_DEV_PLUGIN_ENTRY(disk) ; - REGISTER_DEV_PLUGIN_ENTRY(printer) ; + REGISTER_SVC_PLUGIN_ENTRY(rdpdr); + REGISTER_DEV_PLUGIN_ENTRY(disk); + REGISTER_DEV_PLUGIN_ENTRY(printer); #endif if (!CreateThread(NULL, 0, kbd_thread_func, NULL, 0, NULL)) diff --git a/libfreerdp/channels/libchannels.c b/libfreerdp/channels/libchannels.c index 2644c4e94..1a6131cd2 100644 --- a/libfreerdp/channels/libchannels.c +++ b/libfreerdp/channels/libchannels.c @@ -139,6 +139,7 @@ static rdpChannels* g_init_channels; /* The list of all channel managers. */ typedef struct rdp_channels_list rdpChannelsList; + struct rdp_channels_list { rdpChannels* channels; @@ -296,7 +297,7 @@ static uint32 FREERDP_CC MyVirtualChannelInit(void** ppInitHandle, PCHANNEL_DEF if (ppInitHandle == NULL) { - DEBUG_CHANNELS("error bad pphan"); + DEBUG_CHANNELS("error bad init handle"); return CHANNEL_RC_BAD_INIT_HANDLE; } @@ -690,7 +691,6 @@ int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings, c lib = channels->libs_data + channels->num_libs_data; lib->entry = (PVIRTUALCHANNELENTRY) freerdp_load_plugin(name, CHANNEL_EXPORT_FUNC_NAME); - //lib->entry = (PVIRTUALCHANNELENTRY) freerdp_load_channel_plugin(settings, name, CHANNEL_EXPORT_FUNC_NAME); if (lib->entry == NULL) { diff --git a/libfreerdp/utils/load_plugin.c b/libfreerdp/utils/load_plugin.c index 9b713bc76..5b2548b1e 100644 --- a/libfreerdp/utils/load_plugin.c +++ b/libfreerdp/utils/load_plugin.c @@ -48,108 +48,19 @@ #endif - #define MAX_STATIC_PLUGINS 50 struct static_plugin { - const char* name; - const char* entry_name; - void* entry_addr; + const char* name; + const char* entry_name; + void* entry_addr; }; typedef struct static_plugin staticPlugin; static staticPlugin g_static_plugins[MAX_STATIC_PLUGINS]; static int g_static_plugins_count; - -/** - * UNUSED - * This function opens a handle on the specified library in order to load symbols from it. - * It is just a wrapper over dlopen(), but provides some logs in case of error. - * - * The returned pointer can be used to load a symbol from the library, using the freerdp_get_library_symbol() call. - * The returned pointer should be closed using the freerdp_close_library() call. - * - * @see freerdp_get_library_symbol - * @see freerdp_close_library - * - * @param file [IN] - library name - * @return Pointer to the loaded library. NULL if an error occurs. - */ -void* freerdp_open_library(const char* file) -{ - void* library; - - library = DLOPEN(file); - - if (library == NULL) - { - printf("freerdp_load_library: failed to open %s: %s\n", file, DLERROR()); - return NULL; - } - - return library; -} - -/** - * UNUSED - * This function retrieves a pointer to the specified symbol from the given (loaded) library. - * It is a wrapper over the dlsym() function, but provides some logs in case of error. - * - * @see freerdp_open_library - * @see freerdp_close_library - * - * @param library [IN] - a valid pointer to the opened library. - * This pointer should come from a successful call to freerdp_open_library() - * @param name [IN] - name of the symbol that must be loaded - * - * @return A pointer to the loaded symbol. NULL if an error occured. - */ -void* freerdp_get_library_symbol(void* library, const char* name) -{ - void* symbol; - - symbol = DLSYM(library, name); - - if (symbol == NULL) - { - printf("freerdp_get_library_symbol: failed to load %s: %s\n", name, DLERROR()); - return NULL; - } - - return symbol; -} - -/** - * UNUSED - * This function closes a library handle that was previously opened by freerdp_open_library(). - * It is a wrapper over dlclose(), but provides logs in case of error. - * - * @see freerdp_open_library - * @see freerdp_get_library_symbol - * - * @return true if the close succeeded. false otherwise. - */ -boolean freerdp_close_library(void* library) -{ - int status; - - status = DLCLOSE(library); - -#ifdef _WIN32 - if (status != 0) -#else - if (status == 0) -#endif - { - printf("freerdp_free_library: failed to close: %s\n", DLERROR()); - return false; - } - - return true; -} - /** * This function will load the specified library, retrieve the specified symbol in it, and return a pointer to it. * It is used in freerdp_load_plugin() and freerdp_load_channel_plugin(). @@ -204,7 +115,9 @@ void* freerdp_load_plugin(const char* name, const char* entry_name) /* first attempt to load a static plugin */ entry = freerdp_load_static_plugin(name, entry_name); - if (entry != NULL) return entry; + + if (entry != NULL) + return entry; suffixed_name = freerdp_append_shared_library_suffix((char*) name); @@ -233,71 +146,6 @@ void* freerdp_load_plugin(const char* name, const char* entry_name) return entry; } -/** - * UNUSED - * This function was meant to be used to load channel plugins. - * It was initially called from freerdp_channels_load_plugin() but now we use the freerdp_load_plugin() function - * which is more generic. - * - */ -void* freerdp_load_channel_plugin(rdpSettings* settings, const char* name, const char* entry_name) -{ - char* path; - void* entry; - char* suffixed_name; - - suffixed_name = freerdp_append_shared_library_suffix((char*) name); - - if (!freerdp_path_contains_separator(suffixed_name)) - { - /* no explicit path given, use default path */ - - if (!settings->development_mode) - { - path = freerdp_construct_path(FREERDP_PLUGIN_PATH, suffixed_name); - } - else - { - char* dot; - char* plugin_name; - char* channels_path; - char* channel_subpath; - - dot = strrchr(suffixed_name, '.'); - plugin_name = xmalloc((dot - suffixed_name) + 1); - strncpy(plugin_name, suffixed_name, (dot - suffixed_name)); - plugin_name[(dot - suffixed_name)] = '\0'; - - channels_path = freerdp_construct_path(settings->development_path, "channels"); - channel_subpath = freerdp_construct_path(channels_path, plugin_name); - - path = freerdp_construct_path(channel_subpath, suffixed_name); - - xfree(plugin_name); - xfree(channels_path); - xfree(channel_subpath); - } - } - else - { - /* explicit path given, use it instead of default path */ - path = xstrdup(suffixed_name); - } - - entry = freerdp_load_library_symbol(path, entry_name); - - xfree(suffixed_name); - xfree(path); - - if (entry == NULL) - { - printf("freerdp_load_channel_plugin: failed to load %s/%s\n", name, entry_name); - return NULL; - } - - return entry; -} - /** * This function is used to register a static plugin so that it can be loaded later on using freerdp_load_plugin. * @@ -334,11 +182,12 @@ boolean freerdp_register_static_plugin(const char* name, const char* entry_name, * * @return Pointer to the entry function, NULL if no matching plugin could be found */ + void* freerdp_load_static_plugin(const char* name, const char* entry_name) { int i; staticPlugin* plugin; - + for (i = 0; i < g_static_plugins_count; i++) { plugin = &g_static_plugins[i]; diff --git a/libfreerdp/utils/svc_plugin.c b/libfreerdp/utils/svc_plugin.c index 7b95e4374..956f8e59a 100644 --- a/libfreerdp/utils/svc_plugin.c +++ b/libfreerdp/utils/svc_plugin.c @@ -37,6 +37,7 @@ /* The list of all plugin instances. */ typedef struct rdp_svc_plugin_list rdpSvcPluginList; + struct rdp_svc_plugin_list { rdpSvcPlugin* plugin; @@ -160,7 +161,7 @@ static void svc_plugin_process_received(rdpSvcPlugin* plugin, void* pData, uint3 /* According to MS-RDPBCGR 2.2.6.1, "All virtual channel traffic MUST be suspended. This flag is only valid in server-to-client virtual channel traffic. It MUST be ignored in client-to-server data." Thus it would be best practice to cease data - transmission. However, simply returing here avoids a crash. */ + transmission. However, simply returning here avoids a crash. */ return; }