From 809eccb68280d164ee6ee5f4dd836743fb66146a Mon Sep 17 00:00:00 2001 From: "Asanka C. Herath" Date: Fri, 12 Nov 2010 11:36:27 -0500 Subject: [PATCH] Windows: Add an API for reading a multistring from registry The _krb5_parse_reg_value_as_string() used to concatenate multi-strings using a space to be compatible with krb5_config_get_strings() and friends. Add a new function that can read a multi-string with an arbitrary delimiter character _krb5_parse_reg_value_as_multi_string(). --- lib/krb5/config_reg.c | 27 +++++++++++++++++++++------ lib/krb5/context.c | 8 ++++---- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/krb5/config_reg.c b/lib/krb5/config_reg.c index 33ece1968..d97f0c098 100644 --- a/lib/krb5/config_reg.c +++ b/lib/krb5/config_reg.c @@ -40,6 +40,20 @@ /** * Parse a registry value as a string * + * @see _krb5_parse_reg_value_as_multi_string() + */ +char * +_krb5_parse_reg_value_as_string(krb5_context context, + HKEY key, const char * valuename, + DWORD type, DWORD cb_data) +{ + return _krb5_parse_reg_value_as_multi_string(context, key, valuename, + type, cb_data, " "); +} + +/** + * Parse a registry value as a multi string + * * The following registry value types are handled: * * - REG_DWORD: The decimal string representation is used as the @@ -50,14 +64,15 @@ * - REG_EXPAND_SZ: Environment variables in the string are expanded * and the result is used as the value. * - * - REG_MULTI_SZ: The list of strings is concatenated using a ' ' as - * a separator. No quoting is performed. + * - REG_MULTI_SZ: The list of strings is concatenated using the + * separator. No quoting is performed. * * Any other value type is rejected. * * @param [in]valuename Name of the registry value to be queried * @param [in]type Type of the value. REG_NONE if unknown * @param [in]cbdata Size of value. 0 if unknown. + * @param [in]separator Separator character for concatenating strings. * * @a type and @a cbdata are only considered valid if both are * specified. @@ -67,9 +82,9 @@ * krb5_set_error_message(). */ char * -_krb5_parse_reg_value_as_string(krb5_context context, - HKEY key, const char * valuename, - DWORD type, DWORD cb_data) +_krb5_parse_reg_value_as_multi_string(krb5_context context, + HKEY key, const char * valuename, + DWORD type, DWORD cb_data, char *separator) { LONG rcode = ERROR_MORE_DATA; DWORD cb_alloc; @@ -242,7 +257,7 @@ have_data: iter += len; if (iter[1] != '\0') - *iter++ = ' '; + *iter++ = *separator; else break; } diff --git a/lib/krb5/context.c b/lib/krb5/context.c index 244a17c69..640755b31 100644 --- a/lib/krb5/context.c +++ b/lib/krb5/context.c @@ -760,8 +760,8 @@ _krb5_get_default_config_config_files_from_registry() rcode = RegOpenKeyEx(HKEY_CURRENT_USER, KeyName, 0, KEY_READ, &key); if (rcode == ERROR_SUCCESS) { - config_file = _krb5_parse_reg_value_as_string(NULL, key, "config", - REG_NONE, 0); + config_file = _krb5_parse_reg_value_as_multi_string(NULL, key, "config", + REG_NONE, 0, PATH_SEP); RegCloseKey(key); } @@ -770,8 +770,8 @@ _krb5_get_default_config_config_files_from_registry() rcode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyName, 0, KEY_READ, &key); if (rcode == ERROR_SUCCESS) { - config_file = _krb5_parse_reg_value_as_string(NULL, key, "config", - REG_NONE, 0); + config_file = _krb5_parse_reg_value_as_multi_string(NULL, key, "config", + REG_NONE, 0, PATH_SEP); RegCloseKey(key); }