diff --git a/conf/conf.h b/conf/conf.h index 21dc3fa1..0dea4f94 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -198,11 +198,11 @@ struct symbol *cf_localize_symbol(struct symbol *sym); * Result: Pointer to the newly defined symbol. If we are in the top-level * scope, it's the same @sym as passed to the function. */ -#define cf_define_symbol(sym_, type_, var_, def_) ({ \ - struct symbol *sym = cf_localize_symbol(sym_); \ - sym->class = type_; \ - sym->var_ = def_; \ - sym; }) +#define cf_define_symbol(osym_, type_, var_, def_) ({ \ + struct symbol *sym_ = cf_localize_symbol(osym_); \ + sym_->class = type_; \ + sym_->var_ = def_; \ + sym_; }) void cf_push_scope(struct symbol *); void cf_pop_scope(void); diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index d9d9ad84..5209b9b3 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -95,11 +95,15 @@ drop_gid(gid_t gid) #ifdef PATH_IPROUTE_DIR static inline void -add_num_const(char *name, int val) +add_num_const(char *name, int val, const char *file, const uint line) { struct f_val *v = cfg_alloc(sizeof(struct f_val)); *v = (struct f_val) { .type = T_INT, .val.i = val }; - cf_define_symbol(cf_get_symbol(name), SYM_CONSTANT | T_INT, val, v); + struct symbol *sym = cf_get_symbol(name); + if (sym->class && (sym->scope == conf_this_scope)) + cf_error("Error reading value for %s from %s:%d: already defined", name, file, line); + + cf_define_symbol(sym, SYM_CONSTANT | T_INT, val, v); } /* the code of read_iproute_table() is based on @@ -119,7 +123,7 @@ read_iproute_table(char *file, char *prefix, int max) if (!fp) return; - while (fgets(buf, sizeof(buf), fp)) + for (uint line = 1; fgets(buf, sizeof(buf), fp); line++) { char *p = buf; @@ -142,7 +146,7 @@ read_iproute_table(char *file, char *prefix, int max) if ((*p < 'a' || *p > 'z') && (*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9') && (*p != '_')) *p = '_'; - add_num_const(namebuf, val); + add_num_const(namebuf, val, file, line); } fclose(fp);