0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 09:41:54 +00:00

CLI keeps its active config pointer explicitly

This commit is contained in:
Maria Matejka 2024-06-13 12:29:21 +02:00
parent f5fd70c54a
commit ea996d8403
5 changed files with 15 additions and 12 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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 */