diff options
author | Günther Deschner <gd@samba.org> | 2016-09-13 08:36:59 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2017-01-06 12:28:18 +0100 |
commit | 8e5251c1f30a86ef88c7c145c71deccf19d4189f (patch) | |
tree | 86b8f6c7fcf89fb1044f28aa5bf11bd28b8a94f8 /libgpo | |
parent | 5c16dfe32532e06c7fe9fad6524ebef7d7378b76 (diff) | |
download | samba-8e5251c1f30a86ef88c7c145c71deccf19d4189f.tar.gz |
libgpo: add gp_inifile_enum_section()
Guenther
Signed-off-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'libgpo')
-rw-r--r-- | libgpo/gpo_ini.c | 74 | ||||
-rw-r--r-- | libgpo/gpo_ini.h | 5 |
2 files changed, 79 insertions, 0 deletions
diff --git a/libgpo/gpo_ini.c b/libgpo/gpo_ini.c index 3ea8006d1e1..8166bcb977e 100644 --- a/libgpo/gpo_ini.c +++ b/libgpo/gpo_ini.c @@ -217,6 +217,80 @@ NTSTATUS gp_inifile_getbool(struct gp_inifile_context *ctx, const char *key, boo /**************************************************************** ****************************************************************/ +NTSTATUS gp_inifile_enum_section(struct gp_inifile_context *ctx, + const char *section, + size_t *num_ini_keys, + const char ***ini_keys, + const char ***ini_values) +{ + NTSTATUS status; + int i; + size_t num_keys = 0, num_vals = 0; + const char **keys = NULL; + const char **values = NULL; + + if (section == NULL || num_ini_keys == NULL || + ini_keys == NULL || ini_values == NULL) { + return NT_STATUS_INVALID_PARAMETER; + } + + for (i = 0; i < ctx->keyval_count; i++) { + + bool ok; + + /* + * section: KEYNAME + * KEYNAME:value matches + * KEYNAME_OEM:value not + */ + + if (strlen(section)+1 > strlen(ctx->data[i]->key)) { + continue; + } + + if (!strnequal(section, ctx->data[i]->key, strlen(section))) { + continue; + } + + if (ctx->data[i]->key[strlen(section)] != ':') { + continue; + } + + ok = add_string_to_array(ctx, ctx->data[i]->key, &keys, &num_keys); + if (!ok) { + status = NT_STATUS_NO_MEMORY; + goto failed; + } + + ok = add_string_to_array(ctx, ctx->data[i]->val, &values, &num_vals); + if (!ok) { + status = NT_STATUS_NO_MEMORY; + goto failed; + } + + if (num_keys != num_vals) { + status = NT_STATUS_INTERNAL_DB_CORRUPTION; + goto failed; + } + } + + *num_ini_keys = num_keys; + *ini_keys = keys; + *ini_values = values; + + return NT_STATUS_OK; + + failed: + talloc_free(keys); + talloc_free(values); + + return status; +} + + +/**************************************************************** +****************************************************************/ + NTSTATUS gp_inifile_init_context(TALLOC_CTX *mem_ctx, uint32_t flags, const char *unix_path, diff --git a/libgpo/gpo_ini.h b/libgpo/gpo_ini.h index b948a7a32d0..7c945f85620 100644 --- a/libgpo/gpo_ini.h +++ b/libgpo/gpo_ini.h @@ -46,3 +46,8 @@ NTSTATUS gp_inifile_getstring(struct gp_inifile_context *ctx, const char *key, c NTSTATUS gp_inifile_getint(struct gp_inifile_context *ctx, const char *key, int *ret); NTSTATUS gp_inifile_getbool(struct gp_inifile_context *ctx, const char *key, bool *ret); +NTSTATUS gp_inifile_enum_section(struct gp_inifile_context *ctx, + const char *section, + size_t *num_ini_keys, + const char ***ini_keys, + const char ***ini_values); |