diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 13 | ||||
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/parser.y | 14 |
3 files changed, 14 insertions, 21 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index a01d2a53..8e51a63b 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1384,7 +1384,7 @@ static int cmd_evaluate_delete(struct eval_ctx *ctx, struct cmd *cmd) } } -static int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd) +int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd) { #ifdef DEBUG if (debug_level & DEBUG_EVALUATION) { @@ -1411,14 +1411,3 @@ static int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd) BUG("invalid command operation %u\n", cmd->op); }; } - -int evaluate(struct eval_ctx *ctx, struct list_head *commands) -{ - struct cmd *cmd; - - list_for_each_entry(cmd, commands, list) { - if (cmd_evaluate(ctx, cmd) < 0) - return -1; - } - return 0; -} @@ -216,18 +216,12 @@ out: int nft_run(void *scanner, struct parser_state *state, struct list_head *msgs) { - struct eval_ctx ctx; - int ret = 0; + int ret; ret = nft_parse(scanner, state); if (ret != 0 || state->nerrs > 0) return -1; - memset(&ctx, 0, sizeof(ctx)); - ctx.msgs = msgs; - if (evaluate(&ctx, &state->cmds) < 0) - return -1; - return nft_netlink(state, msgs); } diff --git a/src/parser.y b/src/parser.y index 0dad036c..cc0aed69 100644 --- a/src/parser.y +++ b/src/parser.y @@ -37,6 +37,7 @@ void parser_init(struct parser_state *state, struct list_head *msgs) init_list_head(&state->top_scope.symbols); state->msgs = msgs; state->scopes[0] = scope_init(&state->top_scope, NULL); + state->ectx.msgs = msgs; } static void yyerror(struct location *loc, void *scanner, @@ -492,7 +493,11 @@ input : /* empty */ { if ($2 != NULL) { $2->location = @2; - list_add_tail(&$2->list, &state->cmds); + if (cmd_evaluate(&state->ectx, $2) < 0) { + if (++state->nerrs == max_errors) + YYABORT; + } else + list_add_tail(&$2->list, &state->cmds); } } ; @@ -542,7 +547,12 @@ line : common_block { $$ = NULL; } */ if ($1 != NULL) { $1->location = @1; - list_add_tail(&$1->list, &state->cmds); + + if (cmd_evaluate(&state->ectx, $1) < 0) { + if (++state->nerrs == max_errors) + YYABORT; + } else + list_add_tail(&$1->list, &state->cmds); } $$ = NULL; |