From 5de4cdbedc99ef5583bfb3a4c53b8fd609e971bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 25 Sep 2011 03:12:29 -0400 Subject: [PATCH] wfreerdp: fix mutex handling --- CMakeLists.txt | 7 ++++++ client/DirectFB/CMakeLists.txt | 2 +- client/Windows/CMakeLists.txt | 2 ++ client/Windows/wfreerdp.c | 42 ++++++++++++++++++++++++--------- client/X11/CMakeLists.txt | 3 +-- libfreerdp-chanman/libchanman.c | 4 ++-- libfreerdp-core/tcp.c | 19 ++++++++++++++- libfreerdp-utils/mutex.c | 38 +++++++++++++---------------- 8 files changed, 78 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d38151f74..fb4c0adff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,11 @@ if(NOT DEFINED CMAKE_INSTALL_LIBDIR) set(CMAKE_INSTALL_LIBDIR "lib") endif() +# Set default bindir +if(NOT DEFINED CMAKE_INSTALL_BINDIR) + set(CMAKE_INSTALL_BINDIR "bin") +endif() + # build shared libs if(NOT BUILD_SHARED_LIBS) set(BUILD_SHARED_LIBS ON) @@ -80,6 +85,8 @@ if(MSVC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFREERDP_EXPORTS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWIN32_LEAN_AND_MEAN") + SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}) + SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}) endif() # Include files diff --git a/client/DirectFB/CMakeLists.txt b/client/DirectFB/CMakeLists.txt index 5ae3d2fd0..e4542025b 100644 --- a/client/DirectFB/CMakeLists.txt +++ b/client/DirectFB/CMakeLists.txt @@ -32,4 +32,4 @@ target_link_libraries(dfreerdp freerdp-chanman) target_link_libraries(dfreerdp freerdp-utils) target_link_libraries(dfreerdp ${DIRECTFB_LIBRARIES}) -install(TARGETS dfreerdp DESTINATION bin) +install(TARGETS dfreerdp DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/client/Windows/CMakeLists.txt b/client/Windows/CMakeLists.txt index fcf7566d5..04af45622 100644 --- a/client/Windows/CMakeLists.txt +++ b/client/Windows/CMakeLists.txt @@ -25,3 +25,5 @@ target_link_libraries(wfreerdp freerdp-core) target_link_libraries(wfreerdp freerdp-gdi) target_link_libraries(wfreerdp freerdp-utils) target_link_libraries(wfreerdp freerdp-chanman) + +install(TARGETS wfreerdp DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/client/Windows/wfreerdp.c b/client/Windows/wfreerdp.c index 3b60dce43..d85645723 100644 --- a/client/Windows/wfreerdp.c +++ b/client/Windows/wfreerdp.c @@ -89,8 +89,6 @@ boolean wf_pre_connect(freerdp* instance) settings->order_support[NEG_ELLIPSE_CB_INDEX] = False; settings->kbd_layout = (int) GetKeyboardLayout(0) & 0x0000FFFF; - printf("keyboard_layout: 0x%X\n", settings->kbd_layout); - freerdp_chanman_pre_connect(GET_CHANMAN(instance), instance); return True; @@ -142,6 +140,21 @@ boolean wf_check_fds(freerdp* instance) return True; } +int wf_process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data) +{ + rdpChanMan* chanman = (rdpChanMan*) user_data; + + printf("loading plugin %s\n", name); + freerdp_chanman_load_plugin(chanman, settings, name, plugin_data); + + return 1; +} + +int wf_process_ui_args(rdpSettings* settings, const char* opt, const char* val, void* user_data) +{ + return 0; +} + int wfreerdp_run(freerdp* instance) { MSG msg; @@ -156,6 +169,12 @@ int wfreerdp_run(freerdp* instance) HANDLE fds[64]; rdpChanMan* chanman; + memset(rfds, 0, sizeof(rfds)); + memset(wfds, 0, sizeof(wfds)); + + if (!instance->Connect(instance)) + return 0; + chanman = GET_CHANMAN(instance); /* program main loop */ @@ -169,16 +188,16 @@ int wfreerdp_run(freerdp* instance) printf("Failed to get FreeRDP file descriptor\n"); break; } - if (freerdp_chanman_get_fds(chanman, instance, rfds, &rcount, wfds, &wcount) != True) - { - printf("Failed to get channel manager file descriptor\n"); - break; - } if (wf_get_fds(instance, rfds, &rcount, wfds, &wcount) != True) { printf("Failed to get wfreerdp file descriptor\n"); break; } + if (freerdp_chanman_get_fds(chanman, instance, rfds, &rcount, wfds, &wcount) != True) + { + printf("Failed to get channel manager file descriptor\n"); + break; + } fds_count = 0; /* setup read fds */ @@ -200,7 +219,7 @@ int wfreerdp_run(freerdp* instance) /* do the wait */ if (MsgWaitForMultipleObjects(fds_count, fds, FALSE, INFINITE, QS_ALLINPUT) == WAIT_FAILED) { - printf("wfreerdp_run: WaitForMultipleObjects failed\n"); + printf("wfreerdp_run: WaitForMultipleObjects failed: 0x%04X\n", GetLastError()); break; } @@ -262,6 +281,7 @@ static DWORD WINAPI thread_func(LPVOID lpParam) SET_WFI(instance, wfi); wfreerdp_run(instance); + g_thread_count--; if (g_thread_count < 1) @@ -337,6 +357,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine RegisterClassEx(&wnd_cls); g_hInstance = hInstance; + freerdp_chanman_global_init(); instance = freerdp_new(); instance->PreConnect = wf_pre_connect; @@ -354,12 +375,11 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine data = (thread_data*) xzalloc(sizeof(thread_data)); data->instance = instance; - freerdp_parse_args(instance->settings, __argc, __argv, NULL, NULL, NULL, NULL); + freerdp_parse_args(instance->settings, __argc, __argv, + wf_process_plugin_args, chanman, wf_process_ui_args, NULL); if (CreateThread(NULL, 0, thread_func, data, 0, NULL) != 0) - { g_thread_count++; - } } if (g_thread_count > 0) diff --git a/client/X11/CMakeLists.txt b/client/X11/CMakeLists.txt index 7d273708e..4bc712eda 100644 --- a/client/X11/CMakeLists.txt +++ b/client/X11/CMakeLists.txt @@ -91,5 +91,4 @@ target_link_libraries(xfreerdp freerdp-chanman) target_link_libraries(xfreerdp freerdp-utils) target_link_libraries(xfreerdp ${X11_LIBRARIES} dl) -install(TARGETS xfreerdp DESTINATION bin) - +install(TARGETS xfreerdp DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/libfreerdp-chanman/libchanman.c b/libfreerdp-chanman/libchanman.c index f776a70ef..93a294a0b 100644 --- a/libfreerdp-chanman/libchanman.c +++ b/libfreerdp-chanman/libchanman.c @@ -575,8 +575,8 @@ rdpChanMan* freerdp_chanman_new(void) void freerdp_chanman_free(rdpChanMan * chan_man) { - rdpChanManList * list; - rdpChanManList * prev; + rdpChanManList* list; + rdpChanManList* prev; freerdp_mutex_free(chan_man->sync_data_mutex); list_free(chan_man->sync_data_list); diff --git a/libfreerdp-core/tcp.c b/libfreerdp-core/tcp.c index 778af0938..5285f36eb 100644 --- a/libfreerdp-core/tcp.c +++ b/libfreerdp-core/tcp.c @@ -108,6 +108,7 @@ boolean tcp_connect(rdpTcp* tcp, const char* hostname, uint16 port) struct addrinfo hints = { 0 }; struct addrinfo * res, * ai; + memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; @@ -236,7 +237,15 @@ boolean tcp_set_blocking_mode(rdpTcp* tcp, boolean blocking) rdpTcp* tcp_new(rdpSettings* settings) { - rdpTcp* tcp = (rdpTcp*) xzalloc(sizeof(rdpTcp)); + rdpTcp* tcp; + +#ifdef _WIN32 + int wsaStatus; + WSADATA wsaData; + WORD wVersionRequested; +#endif + + tcp = (rdpTcp*) xzalloc(sizeof(rdpTcp)); if (tcp != NULL) { @@ -244,6 +253,14 @@ rdpTcp* tcp_new(rdpSettings* settings) tcp->settings = settings; } +#ifdef _WIN32 + wVersionRequested = MAKEWORD(2, 2); + wsaStatus = WSAStartup(wVersionRequested, &wsaData); + + if (wsaStatus != 0) + printf("WSAStartup failed with error: %d\n", wsaStatus); +#endif + return tcp; } diff --git a/libfreerdp-utils/mutex.c b/libfreerdp-utils/mutex.c index 3de04623c..38cd226cc 100644 --- a/libfreerdp-utils/mutex.c +++ b/libfreerdp-utils/mutex.c @@ -20,48 +20,42 @@ #include #include -#if defined _WIN32 - +#ifdef _WIN32 #include #define freerdp_mutex_t HANDLE - #else - #include #define freerdp_mutex_t pthread_mutex_t - #endif freerdp_mutex freerdp_mutex_new(void) { - freerdp_mutex_t* mutex; - - mutex = xnew(freerdp_mutex_t); - -#if defined _WIN32 - *mutex = CreateMutex(NULL, FALSE, NULL); +#ifdef _WIN32 + freerdp_mutex_t mutex; + mutex = CreateMutex(NULL, FALSE, NULL); + return (freerdp_mutex) mutex; #else + freerdp_mutex_t* mutex; + mutex = xnew(freerdp_mutex_t); pthread_mutex_init(mutex, 0); -#endif - return mutex; +#endif } void freerdp_mutex_free(freerdp_mutex mutex) { -#if defined _WIN32 - CloseHandle(*((freerdp_mutex_t*)mutex)); +#ifdef _WIN32 + CloseHandle((freerdp_mutex_t) mutex); #else - pthread_mutex_destroy((freerdp_mutex_t*)mutex); -#endif - + pthread_mutex_destroy((freerdp_mutex_t*) mutex); xfree(mutex); +#endif } void freerdp_mutex_lock(freerdp_mutex mutex) { -#if defined _WIN32 - WaitForSingleObject(*((freerdp_mutex_t*)mutex), INFINITE); +#ifdef _WIN32 + WaitForSingleObject((freerdp_mutex_t) mutex, INFINITE); #else pthread_mutex_lock(mutex); #endif @@ -69,8 +63,8 @@ void freerdp_mutex_lock(freerdp_mutex mutex) void freerdp_mutex_unlock(freerdp_mutex mutex) { -#if defined _WIN32 - ReleaseMutex(*((freerdp_mutex_t*)mutex)); +#ifdef _WIN32 + ReleaseMutex((freerdp_mutex_t) mutex); #else pthread_mutex_unlock(mutex); #endif