diff --git a/conf/cf-lex.l b/conf/cf-lex.l index b7ecfb7b..556def31 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -757,14 +757,14 @@ void f_type_methods_register(void); /** * cf_lex_init - initialize the lexer - * @is_cli: true if we're going to parse CLI command, false for configuration + * @cli_main_config: main configuration structure if we're going to parse CLI command, NULL for new configuration * @c: configuration structure * * cf_lex_init() initializes the lexical analyzer and prepares it for * parsing of a new input. */ void -cf_lex_init(int is_cli, struct config *c) +cf_lex_init(struct config *cli_main_config, struct config *c) { if (!global_root_scope.readonly) { @@ -782,7 +782,7 @@ cf_lex_init(int is_cli, struct config *c) } ifs_head = ifs = push_ifs(NULL); - if (!is_cli) + if (!cli_main_config) { ifs->file_name = c->file_name; ifs->fd = c->file_fd; @@ -792,15 +792,15 @@ cf_lex_init(int is_cli, struct config *c) yyrestart(NULL); ifs->buffer = YY_CURRENT_BUFFER; - if (is_cli) + if (cli_main_config) BEGIN(CLI); else BEGIN(INITIAL); c->root_scope = c->current_scope = cfg_allocz(sizeof(struct sym_scope)); - if (is_cli) - c->current_scope->next = config->root_scope; + if (cli_main_config) + c->current_scope->next = cli_main_config->root_scope; else c->current_scope->next = &global_filter_scope; } diff --git a/conf/conf.c b/conf/conf.c index 90dbb444..a7dc7edc 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -138,7 +138,7 @@ config_parse(struct config *c) if (setjmp(conf_jmpbuf)) goto cleanup; - cf_lex_init(0, c); + cf_lex_init(NULL, c); sysdep_preconfig(c); protos_preconfig(c); mpls_preconfig(c); @@ -170,7 +170,7 @@ cleanup: * it parses a CLI command. See the CLI module for more information. */ int -cli_parse(struct config *c) +cli_parse(struct config *main_config, struct config *c) { int done = 0; new_config = c; @@ -178,7 +178,7 @@ cli_parse(struct config *c) if (setjmp(conf_jmpbuf)) goto cleanup; - cf_lex_init(1, c); + cf_lex_init(main_config, c); cf_parse(); done = 1; diff --git a/conf/conf.h b/conf/conf.h index 8b8e0c31..f4f8942e 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -81,7 +81,7 @@ extern _Thread_local struct config *new_config; /* Configuration being parsed */ struct config *config_alloc(const char *name); int config_parse(struct config *); -int cli_parse(struct config *); +int cli_parse(struct config *, struct config *); void config_free(struct config *); void config_free_old(void); int config_commit(struct config *, int type, uint timeout); @@ -216,7 +216,7 @@ struct include_file_stack { extern struct include_file_stack *ifs; int cf_lex(void); -void cf_lex_init(int is_cli, struct config *c); +void cf_lex_init(struct config *cli_main, struct config *c); void cf_lex_unwind(void); struct symbol *cf_find_symbol_scope(const struct sym_scope *scope, const byte *c); diff --git a/nest/cli.c b/nest/cli.c index 92c4640e..c4acb5a7 100644 --- a/nest/cli.c +++ b/nest/cli.c @@ -232,11 +232,13 @@ cli_command(struct cli *c) cli_rh_len = strlen(c->rx_buf); cli_rh_trick_flag = 0; this_cli = c; + this_cli->main_config = config; lp_flush(c->parser_pool); - res = cli_parse(&f); + res = cli_parse(config, &f); if (!res) cli_printf(c, 9001, f.err_msg); + this_cli->main_config = NULL; config_free(&f); } diff --git a/nest/cli.h b/nest/cli.h index be439ffb..bcc64dc0 100644 --- a/nest/cli.h +++ b/nest/cli.h @@ -36,6 +36,7 @@ typedef struct cli { void (*cont)(struct cli *c); void (*cleanup)(struct cli *c); /* The CLI has closed prematurely */ void *rover; /* Private to continuation routine */ + struct config *main_config; /* Main config currently in use */ int last_reply; int restricted; /* CLI is restricted to read-only commands */ struct linpool *parser_pool; /* Pool used during parsing */