From 6c0680db12cd073ca4b252fc2e9d17a2cb11299a Mon Sep 17 00:00:00 2001
From: Robert Schmidt <robert.schmidt@eurecom.fr>
Date: Mon, 2 Jul 2018 10:21:05 +0200
Subject: [PATCH] Add config_getlist in config module

---
 common/config/config_userapi.c | 31 +++++++++++++++++++++++++++++++
 common/config/config_userapi.h |  2 +-
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/common/config/config_userapi.c b/common/config/config_userapi.c
index 57a680044b..57b312494a 100644
--- a/common/config/config_userapi.c
+++ b/common/config/config_userapi.c
@@ -29,6 +29,9 @@
  * \note
  * \warning
  */
+
+#define _GNU_SOURCE
+
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -210,6 +213,34 @@ configmodule_interface_t *cfgif = config_get_if();
 return ret;
 }
 
+int config_getlist(paramlist_def_t *ParamList, paramdef_t *params, int numparams, char *prefix)
+{
+  if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
+    fprintf(stderr,"[CONFIG] config_get skipped, config module not properly initialized\n");
+    return -1;
+  }
+  if (!config_get_if())
+    return -1;
+
+  const int ret = config_get_if()->getlist(ParamList, params, numparams, prefix);
+  if (ret >= 0 && params) {
+    char *newprefix;
+    if (prefix)
+      asprintf(&newprefix, "%s.%s", prefix, ParamList->listname);
+    else
+      newprefix = ParamList->listname;
+    char cfgpath[MAX_OPTNAME_SIZE*2 + 6]; /* prefix.listname.[listindex] */
+    for (int i = 0; i < ParamList->numelt; ++i) {
+      // TODO config_process_cmdline?
+      sprintf(cfgpath, "%s.[%i]", newprefix, i);
+      config_execcheck(ParamList->paramarray[i], numparams, cfgpath);
+    }
+    if (prefix)
+      free(newprefix);
+  }
+  return ret;
+}
+
 int config_isparamset(paramdef_t *params,int paramidx)
 {
   if ((params[paramidx].paramflags & PARAMFLAG_PARAMSET) != 0) {
diff --git a/common/config/config_userapi.h b/common/config/config_userapi.h
index 25306b8778..2b40f8401b 100644
--- a/common/config/config_userapi.h
+++ b/common/config/config_userapi.h
@@ -57,7 +57,7 @@ extern int config_assign_ipv4addr(paramdef_t *cfgoptions, char *ipv4addr);
 
 /* apis to get parameters, to be used by oai modules, at configuration time */
 extern int config_get(paramdef_t *params,int numparams, char *prefix);
-#define config_getlist config_get_if()->getlist
+extern int config_getlist(paramlist_def_t *ParamList, paramdef_t *params, int numparams, char *prefix);
 
 /* apis to retrieve parameters info after calling get or getlist functions */
 extern int config_isparamset(paramdef_t *params,int paramidx);
-- 
GitLab