From 6cd0921f6fd05eafb63c372e0b3add32e035dd59 Mon Sep 17 00:00:00 2001 From: Arturo Borrero Date: Wed, 24 Sep 2014 12:32:19 +0200 Subject: rule: factorize chain and table listing code Let's factorize common code. This is also useful in follow-up patches. Signed-off-by: Arturo Borrero Gonzalez Signed-off-by: Pablo Neira Ayuso --- src/rule.c | 67 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/src/rule.c b/src/rule.c index ab533dac..336c1595 100644 --- a/src/rule.c +++ b/src/rule.c @@ -749,11 +749,42 @@ static void table_cleanup(struct table *table) } } +static int do_list_table(struct netlink_ctx *ctx, struct cmd *cmd, + struct table *table) +{ + struct rule *rule, *nrule; + struct chain *chain; + + if (do_list_sets(ctx, &cmd->location, table) < 0) + goto err; + if (netlink_list_chains(ctx, &cmd->handle, &cmd->location) < 0) + goto err; + list_splice_tail_init(&ctx->list, &table->chains); + if (netlink_list_table(ctx, &cmd->handle, &cmd->location) < 0) + goto err; + + list_for_each_entry_safe(rule, nrule, &ctx->list, list) { + table = table_lookup(&rule->handle); + chain = chain_lookup(table, &rule->handle); + if (chain == NULL) { + chain = chain_alloc(rule->handle.chain); + chain_add_hash(chain, table); + } + + list_move_tail(&rule->list, &chain->rules); + } + + table_print(table); + table_cleanup(table); + return 0; +err: + table_cleanup(table); + return -1; +} + static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd) { struct table *table = NULL; - struct chain *chain; - struct rule *rule, *nrule; struct set *set; /* No need to allocate the table object when listing all tables */ @@ -781,24 +812,9 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd) } return 0; } - /* List content of this table */ - if (do_list_sets(ctx, &cmd->location, table) < 0) - goto err; - if (netlink_list_chains(ctx, &cmd->handle, &cmd->location) < 0) - goto err; - list_splice_tail_init(&ctx->list, &table->chains); - if (netlink_list_table(ctx, &cmd->handle, &cmd->location) < 0) - goto err; - break; + return do_list_table(ctx, cmd, table); case CMD_OBJ_CHAIN: - if (do_list_sets(ctx, &cmd->location, table) < 0) - goto err; - if (netlink_list_chains(ctx, &cmd->handle, &cmd->location) < 0) - goto err; - list_splice_tail_init(&ctx->list, &table->chains); - if (netlink_list_table(ctx, &cmd->handle, &cmd->location) < 0) - goto err; - break; + return do_list_table(ctx, cmd, table); case CMD_OBJ_SETS: if (netlink_list_sets(ctx, &cmd->handle, &cmd->location) < 0) goto err; @@ -825,19 +841,6 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd) BUG("invalid command object type %u\n", cmd->obj); } - list_for_each_entry_safe(rule, nrule, &ctx->list, list) { - table = table_lookup(&rule->handle); - chain = chain_lookup(table, &rule->handle); - if (chain == NULL) { - chain = chain_alloc(rule->handle.chain); - chain_add_hash(chain, table); - } - - list_move_tail(&rule->list, &chain->rules); - } - - table_print(table); - table_cleanup(table); return 0; err: table_cleanup(table); -- cgit v1.2.3