diff options
author | Arturo Borrero <arturo.borrero.glez@gmail.com> | 2014-09-24 12:32:19 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-09-29 12:36:08 +0200 |
commit | 6cd0921f6fd05eafb63c372e0b3add32e035dd59 (patch) | |
tree | 04a5f5ef009ce1bbcb03e7387add5f01857b77fa | |
parent | 2b9010c4c5693f8921fd34ef24acec792608a017 (diff) |
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 <arturo.borrero.glez@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | src/rule.c | 67 |
1 files changed, 35 insertions, 32 deletions
@@ -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); |