From a01f3ec5ab3c4a737c32d9f56113291d5994c32c Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 30 Jun 2023 14:09:51 +0200 Subject: [PATCH] [client,common] allow adding a named keyboard pipe This allows starting FreeRDP clients with a named pipe that will type in text written to the named pipe as keyboard input --- client/common/cmdline.c | 5 +++++ client/common/cmdline.h | 5 +++-- include/freerdp/settings.h | 4 +++- libfreerdp/common/settings_getters.c | 12 ++++++++++++ libfreerdp/common/settings_str.c | 1 + libfreerdp/core/test/settings_property_lists.h | 1 + 6 files changed, 25 insertions(+), 3 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 00ca4bd15..759dc4fe2 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2173,6 +2173,11 @@ static int parse_kbd_options(rdpSettings* settings, const COMMAND_LINE_ARGUMENT_ bval != PARSE_OFF)) rc = COMMAND_LINE_ERROR_UNEXPECTED_VALUE; } + else if (option_starts_with("pipe:", val)) + { + if (!freerdp_settings_set_string(settings, FreeRDP_KeyboardPipeName, &val[5])) + rc = COMMAND_LINE_ERROR_UNEXPECTED_VALUE; + } #if defined(WITH_FREERDP_DEPRECATED_COMMANDLINE) else if (count == 1) { diff --git a/client/common/cmdline.h b/client/common/cmdline.h index 1f40da2cd..641def1b2 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -248,12 +248,13 @@ static const COMMAND_LINE_ARGUMENT_A global_cmd_args[] = { #endif { "kbd", COMMAND_LINE_VALUE_REQUIRED, "[layout:[0x|],lang:<0x>,fn-key:,type:,subtype:,unicode[:" - "on|off],remap:=,remap:=]", + "on|off],remap:=,remap:=,pipe:]", NULL, NULL, -1, NULL, "Keyboard related options:" "* layout: set the keybouard layout announced to the server" "* lang: set the keyboard language identifier sent to the server" - "* fn-key: Function key value" }, + "* fn-key: Function key value" + "* pipe: Name of a named pipe that can be used to type text into the RDP session" }, #if defined(WITH_FREERDP_DEPRECATED_COMMANDLINE) { "kbd-lang", COMMAND_LINE_VALUE_REQUIRED, "0x", NULL, NULL, -1, NULL, "[DEPRECATED, use / kbd:lang:] Keyboard active language identifier" }, diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 101c850e8..1d3d83725 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -845,6 +845,7 @@ extern "C" #define FreeRDP_HasHorizontalWheel (2634) #define FreeRDP_HasExtendedMouseEvent (2635) #define FreeRDP_SuspendInput (2636) +#define FreeRDP_KeyboardPipeName (2637) #define FreeRDP_BrushSupportLevel (2688) #define FreeRDP_GlyphSupportLevel (2752) #define FreeRDP_GlyphCache (2753) @@ -1463,7 +1464,8 @@ extern "C" * input */ ALIGN64 BOOL SuspendInput; /* 2636 */ - UINT64 padding2688[2688 - 2637]; /* 2637 */ + ALIGN64 char* KeyboardPipeName; /* 2637 */ + UINT64 padding2688[2688 - 2638]; /* 2638 */ /* Brush Capabilities */ ALIGN64 UINT32 BrushSupportLevel; /* 2688 */ diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index 491dc7fc8..2ea4f8196 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -2685,6 +2685,9 @@ const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id) case FreeRDP_KerberosStartTime: return settings->KerberosStartTime; + case FreeRDP_KeyboardPipeName: + return settings->KeyboardPipeName; + case FreeRDP_KeyboardRemappingList: return settings->KeyboardRemappingList; @@ -2960,6 +2963,9 @@ char* freerdp_settings_get_string_writable(rdpSettings* settings, size_t id) case FreeRDP_KerberosStartTime: return settings->KerberosStartTime; + case FreeRDP_KeyboardPipeName: + return settings->KeyboardPipeName; + case FreeRDP_KeyboardRemappingList: return settings->KeyboardRemappingList; @@ -3244,6 +3250,9 @@ BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, char* val, s case FreeRDP_KerberosStartTime: return update_string_(&settings->KerberosStartTime, cnv.c, len); + case FreeRDP_KeyboardPipeName: + return update_string_(&settings->KeyboardPipeName, cnv.c, len); + case FreeRDP_KeyboardRemappingList: return update_string_(&settings->KeyboardRemappingList, cnv.c, len); @@ -3544,6 +3553,9 @@ BOOL freerdp_settings_set_string_copy_(rdpSettings* settings, size_t id, const c case FreeRDP_KerberosStartTime: return update_string_copy_(&settings->KerberosStartTime, cnv.cc, len, cleanup); + case FreeRDP_KeyboardPipeName: + return update_string_copy_(&settings->KeyboardPipeName, cnv.cc, len, cleanup); + case FreeRDP_KeyboardRemappingList: return update_string_copy_(&settings->KeyboardRemappingList, cnv.cc, len, cleanup); diff --git a/libfreerdp/common/settings_str.c b/libfreerdp/common/settings_str.c index 30b174b1e..d52332a25 100644 --- a/libfreerdp/common/settings_str.c +++ b/libfreerdp/common/settings_str.c @@ -475,6 +475,7 @@ static const struct settings_str_entry settings_map[] = { { FreeRDP_KerberosRenewableLifeTime, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosRenewableLifeTime" }, { FreeRDP_KerberosStartTime, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KerberosStartTime" }, + { FreeRDP_KeyboardPipeName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KeyboardPipeName" }, { FreeRDP_KeyboardRemappingList, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_KeyboardRemappingList" }, { FreeRDP_NtlmSamFile, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_NtlmSamFile" }, diff --git a/libfreerdp/core/test/settings_property_lists.h b/libfreerdp/core/test/settings_property_lists.h index 9ab571b44..9745e4135 100644 --- a/libfreerdp/core/test/settings_property_lists.h +++ b/libfreerdp/core/test/settings_property_lists.h @@ -385,6 +385,7 @@ static const size_t string_list_indices[] = { FreeRDP_KerberosRealm, FreeRDP_KerberosRenewableLifeTime, FreeRDP_KerberosStartTime, + FreeRDP_KeyboardPipeName, FreeRDP_KeyboardRemappingList, FreeRDP_NtlmSamFile, FreeRDP_Password,