浏览代码

- rejecting config declarations with conflicting group name
- cfg_declare_int() is extended with min/max support

Miklos Tirpak 17 年之前
父节点
当前提交
c092bd34ee
共有 7 个文件被更改,包括 60 次插入34 次删除
  1. 2 2
      cfg.y
  2. 12 1
      cfg/cfg.c
  3. 2 1
      cfg/cfg.h
  4. 23 30
      cfg/cfg_script.c
  5. 2 0
      cfg/cfg_script.h
  6. 16 0
      cfg/cfg_struct.c
  7. 3 0
      cfg/cfg_struct.h

+ 2 - 2
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");
 		}
 	}

+ 12 - 1
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;
 }

+ 2 - 1
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);

+ 23 - 30
cfg/cfg_script.c

@@ -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;

+ 2 - 0
cfg/cfg_script.h

@@ -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;

+ 16 - 0
cfg/cfg_struct.c

@@ -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)

+ 3 - 0
cfg/cfg_struct.h

@@ -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,