summaryrefslogtreecommitdiff
path: root/libgpo
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2016-09-13 08:36:59 +0200
committerAndreas Schneider <asn@cryptomilk.org>2017-01-06 12:28:18 +0100
commit8e5251c1f30a86ef88c7c145c71deccf19d4189f (patch)
tree86b8f6c7fcf89fb1044f28aa5bf11bd28b8a94f8 /libgpo
parent5c16dfe32532e06c7fe9fad6524ebef7d7378b76 (diff)
downloadsamba-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.c74
-rw-r--r--libgpo/gpo_ini.h5
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);