Add support for comments in configuration variables 95/52195/1
authorXavier Simonart <xavier.simonart@intel.com>
Thu, 15 Feb 2018 14:45:04 +0000 (15:45 +0100)
committerXavier Simonart <xavier.simonart@intel.com>
Thu, 15 Feb 2018 14:45:04 +0000 (15:45 +0100)
This feature will enable the possibility to have many cores
configured in a prox config file, and enable/disable them
through variables.
For instance, a [core $var1] section in a config file will
result in [core 1] if $var1 = 1; the whole section and section
content will be ignored if $var1=#
Before this implementation, [#core 1] or [core #] was already
treated as a commented out section (the whole section was
commented). But there was no way to define a variable $var = #
to comment a section through a variable.

Note that in today's implementation any non numerical
(except s, h, t, -) characteter in the [core] section header
(and not only #) will cause the section to be ignored.
It would probably be better to consider # (as maybe N/A and none)
as comments, and everything else as error. This is however not
supported by the change request.

Change-Id: Id4e2b27a1f9b6d595e0b442dcd971ad44a502031
Signed-off-by: Xavier Simonart <xavier.simonart@intel.com>
VNFs/DPPD-PROX/cfgfile.c
VNFs/DPPD-PROX/parse_utils.c
VNFs/DPPD-PROX/parse_utils.h

index 80a9093..0c5950e 100644 (file)
@@ -188,13 +188,17 @@ static struct cfg_section *cfg_check_section(char *buffer, struct cfg_section *p
        if (*pend == '\0') {
                return NULL;
        }
-       /* only numeric characters are valid for section index
-          (currently, variables not checked!) */
-       if (pend[0] != '$') {
-               for (len = 0; pend[len] != '\0'; ++len) {
-                       if (strchr(valid, pend[len]) == NULL) {
-                               return NULL;
-                       }
+
+       /* only numeric characters are valid for section index */
+       char val[MAX_CFG_STRING_LEN];
+       if (pend[0] == '$')
+               parse_single_var(val, sizeof(val), pend);
+       else
+               strncpy(val, pend, sizeof(val));
+
+       for (len = 0; val[len] != '\0'; ++len) {
+               if (strchr(valid, val[len]) == NULL) {
+                       return NULL;
                }
        }
 
index d258c59..52337ff 100644 (file)
@@ -106,7 +106,7 @@ static struct var *var_lookup(const char *name)
        return NULL;
 }
 
-static int parse_single_var(char *val, size_t len, const char *name)
+int parse_single_var(char *val, size_t len, const char *name)
 {
        struct var *match;
 
@@ -135,7 +135,7 @@ int parse_vars(char *val, size_t len, const char *name)
 {
        static char result[MAX_CFG_STRING_LEN];
        static char cur_var[MAX_CFG_STRING_LEN];
-       char parsed[2048];
+       char parsed[MAX_CFG_STRING_LEN];
        size_t name_len = strlen(name);
        enum parse_vars_state {NO_VAR, WHOLE_VAR, INLINE_VAR} state = NO_VAR;
        size_t result_len = 0;
index 14aee9e..27ebb0b 100644 (file)
@@ -118,4 +118,6 @@ const char* get_parse_err(void);
 /* Returns true if running from  a virtual machine. */
 int is_virtualized(void);
 
+int parse_single_var(char *val, size_t len, const char *name);
+
 #endif /* _PARSE_UTILS_H_ */