diff options
-rw-r--r-- | include/parser.h | 1 | ||||
-rw-r--r-- | include/rule.h | 2 | ||||
-rw-r--r-- | src/evaluate.c | 13 | ||||
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/parser.y | 14 |
5 files changed, 16 insertions, 22 deletions
diff --git a/include/parser.h b/include/parser.h index 7a1c2dbe..92beab28 100644 --- a/include/parser.h +++ b/include/parser.h @@ -26,6 +26,7 @@ struct parser_state { unsigned int scope; struct list_head cmds; + struct eval_ctx ectx; }; extern void parser_init(struct parser_state *state, struct list_head *msgs); diff --git a/include/rule.h b/include/rule.h index 47dd6ab9..e06444eb 100644 --- a/include/rule.h +++ b/include/rule.h @@ -303,7 +303,7 @@ struct eval_ctx { struct proto_ctx pctx; }; -extern int evaluate(struct eval_ctx *ctx, struct list_head *commands); +extern int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd); extern struct error_record *rule_postprocess(struct rule *rule); 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; |