From 6b1fefea4012338029457cb7913acd1dd025b164 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 6 May 2015 16:32:45 -0400 Subject: [PATCH] freerdp: fix remote assistance mode, add multi-address connection --- client/common/client.c | 6 ++-- client/common/cmdline.c | 16 +++++++++++ include/freerdp/assistance.h | 5 ++++ include/freerdp/settings.h | 3 +- libfreerdp/common/assistance.c | 63 ++++++++++++++++++++++++++++++++++++++++++ libfreerdp/common/settings.c | 2 ++ libfreerdp/core/settings.c | 9 ++++++ libfreerdp/core/tcp.c | 9 ++++-- 8 files changed, 107 insertions(+), 6 deletions(-) diff --git a/client/common/client.c b/client/common/client.c index 2c68514..53c4413 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -51,6 +51,7 @@ rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) pEntryPoints->GlobalInit(); instance = freerdp_new(); + if (!instance) return NULL; @@ -59,11 +60,12 @@ rdpContext* freerdp_client_context_new(RDP_CLIENT_ENTRY_POINTS* pEntryPoints) instance->ContextNew = freerdp_client_common_new; instance->ContextFree = freerdp_client_common_free; instance->pClientEntryPoints = (RDP_CLIENT_ENTRY_POINTS*) malloc(pEntryPoints->Size); + if (!instance->pClientEntryPoints) goto out_fail; - CopyMemory(instance->pClientEntryPoints, pEntryPoints, pEntryPoints->Size); + if (!freerdp_context_new(instance)) goto out_fail2; @@ -202,7 +204,7 @@ int freerdp_client_settings_parse_command_line(rdpSettings* settings, int argc, /* This function will call logic that is applicable to the settings * from command line parsing AND the rdp file parsing */ - if(!freerdp_client_settings_post_process(settings)) + if (!freerdp_client_settings_post_process(settings)) status = -1; return status; diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 0b30423..6b40ca6 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -932,33 +932,39 @@ int freerdp_map_keyboard_layout_name_to_id(char* name) RDP_KEYBOARD_LAYOUT* layouts; layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD); + for (i = 0; layouts[i].code; i++) { if (_stricmp(layouts[i].name, name) == 0) id = layouts[i].code; } + free(layouts); if (id) return id; layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); + for (i = 0; layouts[i].code; i++) { if (_stricmp(layouts[i].name, name) == 0) id = layouts[i].code; } + free(layouts); if (id) return id; layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME); + for (i = 0; layouts[i].code; i++) { if (_stricmp(layouts[i].name, name) == 0) id = layouts[i].code; } + free(layouts); if (id) @@ -982,6 +988,14 @@ int freerdp_detect_command_line_pre_filter(void* context, int index, int argc, L return 1; } } + + if (length > 13) + { + if (_stricmp(&(argv[index])[length - 13], ".msrcIncident") == 0) + { + return 1; + } + } } return 0; @@ -997,6 +1011,7 @@ int freerdp_detect_windows_style_command_line_syntax(int argc, char** argv, flags = COMMAND_LINE_SEPARATOR_COLON; flags |= COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SIGIL_PLUS_MINUS; + if (ignoreUnknown) { flags |= COMMAND_LINE_IGN_UNKNOWN_KEYWORD; @@ -1040,6 +1055,7 @@ int freerdp_detect_posix_style_command_line_syntax(int argc, char** argv, flags = COMMAND_LINE_SEPARATOR_SPACE; flags |= COMMAND_LINE_SIGIL_DASH | COMMAND_LINE_SIGIL_DOUBLE_DASH; flags |= COMMAND_LINE_SIGIL_ENABLE_DISABLE; + if (ignoreUnknown) { flags |= COMMAND_LINE_IGN_UNKNOWN_KEYWORD; diff --git a/include/freerdp/assistance.h b/include/freerdp/assistance.h index 050f933..23ce933 100644 --- a/include/freerdp/assistance.h +++ b/include/freerdp/assistance.h @@ -47,6 +47,11 @@ struct rdp_assistance_file char* MachineAddress; UINT32 MachinePort; + + UINT32 MachineCount; + char** MachineAddresses; + UINT32* MachinePorts; + char* RASessionId; char* RASpecificParams; }; diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index c29d349..c0f32e6 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -1032,7 +1032,8 @@ struct rdp_settings ALIGN64 UINT32 RedirectionTsvUrlLength; /* 1227 */ ALIGN64 UINT32 TargetNetAddressCount; /* 1228 */ ALIGN64 char** TargetNetAddresses; /* 1229 */ - UINT64 padding1280[1280 - 1230]; /* 1230 */ + ALIGN64 UINT32* TargetNetPorts; /* 1230 */ + UINT64 padding1280[1280 - 1231]; /* 1231 */ /** * Security diff --git a/libfreerdp/common/assistance.c b/libfreerdp/common/assistance.c index b53272a..06178cb 100644 --- a/libfreerdp/common/assistance.c +++ b/libfreerdp/common/assistance.c @@ -153,6 +153,36 @@ int freerdp_assistance_parse_address_list(rdpAssistanceFile* file, char* list) } } + file->MachineCount = count; + file->MachineAddresses = (char**) calloc(count, sizeof(char*)); + file->MachinePorts = (UINT32*) calloc(count, sizeof(UINT32)); + + if (!file->MachineAddresses || !file->MachinePorts) + return -1; + + for (i = 0; i < count; i++) + { + length = strlen(tokens[i]); + + p = tokens[i]; + + q = strchr(p, ':'); + + if (!q) + { + free(tokens); + return -1; + } + + q[0] = '\0'; + q++; + + file->MachineAddresses[i] = _strdup(p); + file->MachinePorts[i] = (UINT32) atoi(q); + + q[-1] = ':'; + } + for (i = 0; i < count; i++) { length = strlen(tokens[i]); @@ -181,8 +211,10 @@ int freerdp_assistance_parse_address_list(rdpAssistanceFile* file, char* list) break; } + if (tokens) free(tokens); + return 1; } @@ -1056,6 +1088,10 @@ int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name) } buffer = (BYTE*) malloc(fileSize + 2); + + if (!buffer) + return -1; + readSize = fread(buffer, fileSize, 1, fp); if (!readSize) @@ -1084,6 +1120,8 @@ int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name) int freerdp_client_populate_settings_from_assistance_file(rdpAssistanceFile* file, rdpSettings* settings) { + UINT32 i; + freerdp_set_param_bool(settings, FreeRDP_RemoteAssistanceMode, TRUE); if (!file->RASessionId) @@ -1103,6 +1141,21 @@ int freerdp_client_populate_settings_from_assistance_file(rdpAssistanceFile* fil freerdp_set_param_string(settings, FreeRDP_ServerHostname, file->MachineAddress); freerdp_set_param_uint32(settings, FreeRDP_ServerPort, file->MachinePort); + freerdp_target_net_addresses_free(settings); + + settings->TargetNetAddressCount = file->MachineCount; + settings->TargetNetAddresses = (char**) calloc(file->MachineCount, sizeof(char*)); + settings->TargetNetPorts = (UINT32*) calloc(file->MachineCount, sizeof(UINT32)); + + for (i = 0; i < settings->TargetNetAddressCount; i++) + { + settings->TargetNetAddresses[i] = _strdup(file->MachineAddresses[i]); + settings->TargetNetPorts[i] = file->MachinePorts[i]; + + fprintf(stderr, "count: %d index: %d address: %s port: %d\n", + settings->TargetNetAddressCount, i, settings->TargetNetAddresses[i], settings->TargetNetPorts[i]); + } + return 1; } @@ -1122,6 +1175,8 @@ rdpAssistanceFile* freerdp_assistance_file_new() void freerdp_assistance_file_free(rdpAssistanceFile* file) { + UINT32 i; + if (!file) return; @@ -1137,5 +1192,13 @@ void freerdp_assistance_file_free(rdpAssistanceFile* file) free(file->MachineAddress); free(file->EncryptedPassStub); + for (i = 0; i < file->MachineCount; i++) + { + free(file->MachineAddresses[i]); + } + + free(file->MachineAddresses); + free(file->MachinePorts); + free(file); } diff --git a/libfreerdp/common/settings.c b/libfreerdp/common/settings.c index c4dbbfc..f095d5d 100644 --- a/libfreerdp/common/settings.c +++ b/libfreerdp/common/settings.c @@ -610,9 +610,11 @@ void freerdp_target_net_addresses_free(rdpSettings* settings) free(settings->TargetNetAddresses[index]); free(settings->TargetNetAddresses); + free(settings->TargetNetPorts); settings->TargetNetAddressCount = 0; settings->TargetNetAddresses = NULL; + settings->TargetNetPorts = NULL; } void freerdp_performance_flags_make(rdpSettings* settings) diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 8f14d6e..26d6ccd 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -590,6 +590,7 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings) _settings->RedirectionTsvUrlLength = 0; _settings->TargetNetAddressCount = 0; _settings->TargetNetAddresses = NULL; + _settings->TargetNetPorts = NULL; if (settings->LoadBalanceInfo && settings->LoadBalanceInfoLength) { @@ -664,6 +665,14 @@ rdpSettings* freerdp_settings_clone(rdpSettings* settings) for (index = 0; index < settings->TargetNetAddressCount; index++) _settings->TargetNetAddresses[index] = _strdup(settings->TargetNetAddresses[index]); + + if (settings->TargetNetPorts) + { + _settings->TargetNetPorts = (UINT32*) malloc(sizeof(UINT32) * settings->TargetNetAddressCount); + + for (index = 0; index < settings->TargetNetAddressCount; index++) + _settings->TargetNetPorts[index] = settings->TargetNetPorts[index]; + } } _settings->DeviceCount = settings->DeviceCount; diff --git a/libfreerdp/core/tcp.c b/libfreerdp/core/tcp.c index ed4be25..fd978e3 100644 --- a/libfreerdp/core/tcp.c +++ b/libfreerdp/core/tcp.c @@ -816,7 +816,7 @@ BOOL freerdp_tcp_connect_timeout(int sockfd, struct sockaddr* addr, socklen_t ad #ifndef _WIN32 -int freerdp_tcp_connect_multi(char** hostnames, int count, int port, int timeout) +int freerdp_tcp_connect_multi(char** hostnames, UINT32* ports, int count, int port, int timeout) { int index; int sindex; @@ -849,6 +849,9 @@ int freerdp_tcp_connect_multi(char** hostnames, int count, int port, int timeout hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; + if (ports) + sprintf_s(port_str, sizeof(port_str) - 1, "%u", ports[index]); + status = getaddrinfo(hostnames[index], port_str, &hints, &result); if (status) @@ -1088,13 +1091,13 @@ int freerdp_tcp_connect(rdpSettings* settings, const char* hostname, int port, i if (!settings->GatewayEnabled) { - if (!freerdp_tcp_resolve_hostname(hostname)) + if (!freerdp_tcp_resolve_hostname(hostname) || settings->RemoteAssistanceMode) { if (settings->TargetNetAddressCount > 0) { #ifndef _WIN32 sockfd = freerdp_tcp_connect_multi(settings->TargetNetAddresses, - settings->TargetNetAddressCount, port, timeout); + settings->TargetNetPorts, settings->TargetNetAddressCount, port, timeout); #else hostname = settings->TargetNetAddresses[0]; #endif -- 2.7.4