- rejecting config declarations with conflicting group name
authorMiklos Tirpak <miklos@iptel.org>
Mon, 28 Jan 2008 15:35:56 +0000 (15:35 +0000)
committerMiklos Tirpak <miklos@iptel.org>
Mon, 28 Jan 2008 15:35:56 +0000 (15:35 +0000)
- cfg_declare_int() is extended with min/max support

cfg.y
cfg/cfg.c
cfg/cfg.h
cfg/cfg_script.c
cfg/cfg_script.h
cfg/cfg_struct.c
cfg/cfg_struct.h

diff --git a/cfg.y b/cfg.y
index c7746d2..25d7299 100644 (file)
--- a/cfg.y
+++ b/cfg.y
@@ -1110,7 +1110,7 @@ assign_stm:
        ;
 cfg_var:
        ID DOT ID EQUAL NUMBER {
-               if (cfg_declare_int($1, $3, $5, NULL)) {
+               if (cfg_declare_int($1, $3, $5, 0, 0, NULL)) {
                        yyerror("variable cannot be declared");
                }
        }
@@ -1120,7 +1120,7 @@ cfg_var:
                }
        }
        | ID DOT ID EQUAL NUMBER CFG_DESCRIPTION STRING {
-               if (cfg_declare_int($1, $3, $5, $7)) {
+               if (cfg_declare_int($1, $3, $5, 0, 0, $7)) {
                        yyerror("variable cannot be declared");
                }
        }
index 1610536..58b2a32 100644 (file)
--- a/cfg/cfg.c
+++ b/cfg/cfg.c
@@ -122,6 +122,14 @@ int cfg_declare(char *group_name, cfg_def_t *def, void *values, int def_size,
        }
 
        group_name_len = strlen(group_name);
+       /* check for duplicates */
+       if (cfg_lookup_group(group_name, group_name_len)) {
+               LOG(L_ERR, "ERROR: register_cfg_def(): "
+                       "configuration group has been already declared: %s\n",
+                       group_name);
+               goto error;
+       }
+
        /* create a new group
        I will allocate memory in shm mem for the variables later in a single block,
        when we know the size of all the registered groups. */
@@ -152,7 +160,8 @@ error:
 }
 
 /* declares a single variable with integer type */
-int cfg_declare_int(char *group_name, char *var_name, int val, char *descr)
+int cfg_declare_int(char *group_name, char *var_name,
+               int val, int min, int max, char *descr)
 {
        cfg_script_var_t        *var;
 
@@ -160,6 +169,8 @@ int cfg_declare_int(char *group_name, char *var_name, int val, char *descr)
                return -1;
 
        var->val.i = val;
+       var->min = min;
+       var->max = max;
 
        return 0;
 }
index 6ab367d..89f5a33 100644 (file)
--- a/cfg/cfg.h
+++ b/cfg/cfg.h
@@ -76,7 +76,8 @@ int cfg_declare(char *group_name, cfg_def_t *def, void *values, int def_size,
        ((struct cfg_group_##gname *)handle)->var
 
 /* declares a single variable with integer type */
-int cfg_declare_int(char *group_name, char *var_name, int val, char *descr);
+int cfg_declare_int(char *group_name, char *var_name,
+               int val, int min, int max, char *descr);
 
 /* declares a single variable with str type */
 int cfg_declare_str(char *group_name, char *var_name, char *val, char *descr);
index f91683d..ad652d9 100644 (file)
@@ -57,26 +57,32 @@ cfg_script_var_t *new_cfg_script_var(char *gname, char *vname, unsigned int type
        }
 
        gname_len = strlen(gname);
+       vname_len = strlen(vname);
        /* the group may have been already declared */
-       for (   group = cfg_group;
-               group;
-               group = group->next
-       ) {
-               if ((group->name_len == gname_len) &&
-               (memcmp(group->name, gname, gname_len) == 0)) {
-                       if (group->dynamic == 0) {
-                               /* the group has been already declared by a module or by the core */
-                               LOG(L_ERR, "ERROR: new_cfg_script_var(): "
-                                       "configuration group has been already declared: %s\n",
-                                       gname);
+       group = cfg_lookup_group(gname, gname_len);
+       if (group) {
+               if (group->dynamic == 0) {
+                       /* the group has been already declared by a module or by the core */
+                       LOG(L_ERR, "ERROR: new_cfg_script_var(): "
+                               "configuration group has been already declared: %s\n",
+                               gname);
+                       return NULL;
+               }
+               /* the dynamic group is found */
+               /* verify that the variable does not exist */
+               for (   var = (cfg_script_var_t *)group->vars;
+                       var;
+                       var = var->next
+               ) {
+                       if ((var->name_len == vname_len) &&
+                       (memcmp(var->name, vname, vname_len) == 0)) {
+                               LOG(L_ERR, "ERROR: new_cfg_script_var(): variable already exists: %s.%s\n",
+                                               gname, vname);
                                return NULL;
                        }
-                       /* the dynamic group is found */
-                       break;
                }
-       }
 
-       if (!group) {
+       } else {
                /* create a new group with NULL values, we will fix it later,
                when all the variables are known */
                group = cfg_new_group(gname, gname_len,
@@ -87,21 +93,6 @@ cfg_script_var_t *new_cfg_script_var(char *gname, char *vname, unsigned int type
                group->dynamic = 1;
        }
 
-       /* verify that the variable does not exist */
-       vname_len = strlen(vname);
-
-       for (   var = (cfg_script_var_t *)group->vars;
-               var;
-               var = var->next
-       ) {
-               if ((var->name_len == vname_len) &&
-               (memcmp(var->name, vname, vname_len) == 0)) {
-                       LOG(L_ERR, "ERROR: new_cfg_script_var(): variable already exists: %s.%s\n",
-                                       gname, vname);
-                       return NULL;
-               }
-       }
-
        switch (type) {
        case CFG_VAR_INT:
                group->size = ROUND_INT(group->size);
@@ -183,6 +174,8 @@ int cfg_script_fixup(cfg_group_t *group, unsigned char *block)
                def[i].name = script_var->name;
                def[i].type = script_var->type | (script_var->type << CFG_INPUT_SHIFT);
                def[i].descr = script_var->descr;
+               def[i].min = script_var->min;
+               def[i].max = script_var->max;
 
                mapping[i].def = &(def[i]);
                mapping[i].name_len = script_var->name_len;
index 1bdb3aa..94fca11 100644 (file)
@@ -43,6 +43,8 @@ typedef struct _cfg_script_var {
                str     s;
                int     i;
        } val;
+       int     min;
+       int     max;
        struct _cfg_script_var  *next;
        int     name_len;
        char    *name;
index 6c7498a..ea89b73 100644 (file)
@@ -397,6 +397,22 @@ void cfg_child_destroy(void)
        cfg_child_cb = NULL;
 }
 
+/* searches a group by name */
+cfg_group_t *cfg_lookup_group(char *name, int len)
+{
+       cfg_group_t     *g;
+
+       for (   g = cfg_group;
+               g;
+               g = g->next
+       )
+               if ((g->name_len == len)
+               && (memcmp(g->name, name, len)==0))
+                       return g;
+
+       return NULL;
+}
+
 /* searches a variable definition by group and variable name */
 int cfg_lookup_var(str *gname, str *vname,
                        cfg_group_t **group, cfg_mapping_t **var)
index 6fbfb15..6fd24da 100644 (file)
@@ -248,6 +248,9 @@ static inline void cfg_update_local(void)
                if (unlikely(cfg_local != *cfg_global)) \
                        cfg_update_local(); \
        } while(0)
+
+/* searches a group by name */
+cfg_group_t *cfg_lookup_group(char *name, int len);
        
 /* searches a variable definition by group and variable name */
 int cfg_lookup_var(str *gname, str *vname,