Let's factorize common code. This is also useful in follow-up patches. Signed-off-by: Arturo Borrero Gonzalez <arturo.borrero.glez@xxxxxxxxx> --- src/rule.c | 67 +++++++++++++++++++++++++++++++----------------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/src/rule.c b/src/rule.c index 2fe2520..ac72f12 100644 --- a/src/rule.c +++ b/src/rule.c @@ -749,11 +749,42 @@ static void do_command_list_cleanup(struct table *table) } } +static int do_command_list_table_content(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); + do_command_list_cleanup(table); + return 0; +err: + do_command_list_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_command_list_table_content(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_command_list_table_content(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); - do_command_list_cleanup(table); return 0; err: do_command_list_cleanup(table); -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html