Conf: Better error message when reading iproute2 config
Reported by: Martin Weinelt <martin@darmstadt.freifunk.net>
This commit is contained in:
parent
027a3e66f7
commit
ab089f4fb5
2 changed files with 13 additions and 9 deletions
10
conf/conf.h
10
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
|
* 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.
|
* scope, it's the same @sym as passed to the function.
|
||||||
*/
|
*/
|
||||||
#define cf_define_symbol(sym_, type_, var_, def_) ({ \
|
#define cf_define_symbol(osym_, type_, var_, def_) ({ \
|
||||||
struct symbol *sym = cf_localize_symbol(sym_); \
|
struct symbol *sym_ = cf_localize_symbol(osym_); \
|
||||||
sym->class = type_; \
|
sym_->class = type_; \
|
||||||
sym->var_ = def_; \
|
sym_->var_ = def_; \
|
||||||
sym; })
|
sym_; })
|
||||||
|
|
||||||
void cf_push_scope(struct symbol *);
|
void cf_push_scope(struct symbol *);
|
||||||
void cf_pop_scope(void);
|
void cf_pop_scope(void);
|
||||||
|
|
|
@ -95,11 +95,15 @@ drop_gid(gid_t gid)
|
||||||
#ifdef PATH_IPROUTE_DIR
|
#ifdef PATH_IPROUTE_DIR
|
||||||
|
|
||||||
static inline void
|
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));
|
struct f_val *v = cfg_alloc(sizeof(struct f_val));
|
||||||
*v = (struct f_val) { .type = T_INT, .val.i = 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
|
/* the code of read_iproute_table() is based on
|
||||||
|
@ -119,7 +123,7 @@ read_iproute_table(char *file, char *prefix, int max)
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (fgets(buf, sizeof(buf), fp))
|
for (uint line = 1; fgets(buf, sizeof(buf), fp); line++)
|
||||||
{
|
{
|
||||||
char *p = buf;
|
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 != '_'))
|
if ((*p < 'a' || *p > 'z') && (*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9') && (*p != '_'))
|
||||||
*p = '_';
|
*p = '_';
|
||||||
|
|
||||||
add_num_const(namebuf, val);
|
add_num_const(namebuf, val, file, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
Loading…
Reference in a new issue