summaryrefslogtreecommitdiffstats
path: root/libebtc.c
diff options
context:
space:
mode:
authorBart De Schuymer <bdschuym@pandora.be>2006-07-31 19:47:45 +0000
committerBart De Schuymer <bdschuym@pandora.be>2006-07-31 19:47:45 +0000
commit0faecd528aaa02f2d47fe4cdb56db3774189c576 (patch)
tree7e7d969baf76ed4ab244e411f4692c259e8ad98a /libebtc.c
parent15a1fac3e219a4687eee169776074b4b2ad1ba98 (diff)
fix -X bug
Diffstat (limited to 'libebtc.c')
-rw-r--r--libebtc.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/libebtc.c b/libebtc.c
index 01bb6f3..02003a7 100644
--- a/libebtc.c
+++ b/libebtc.c
@@ -838,7 +838,8 @@ void ebt_new_chain(struct ebt_u_replace *replace, const char *name, int policy)
new->kernel_start = NULL;
}
-static void ebt_delete_a_chain(struct ebt_u_replace *replace, int chain, int print_err)
+/* returns -1 if the chain is referenced, 0 on success */
+static int ebt_delete_a_chain(struct ebt_u_replace *replace, int chain, int print_err)
{
int tmp = replace->selected_chain;
/* If the chain is referenced, don't delete it,
@@ -846,7 +847,7 @@ static void ebt_delete_a_chain(struct ebt_u_replace *replace, int chain, int pri
* one we're deleting */
replace->selected_chain = chain;
if (ebt_check_for_references(replace, print_err))
- return;
+ return -1;
decrease_chain_jumps(replace);
ebt_flush_chains(replace);
replace->selected_chain = tmp;
@@ -854,20 +855,22 @@ static void ebt_delete_a_chain(struct ebt_u_replace *replace, int chain, int pri
free(replace->chains[chain]);
memmove(replace->chains+chain, replace->chains+chain+1, (replace->num_chains-chain-1)*sizeof(void *));
replace->num_chains--;
+ return 0;
}
/* Selected_chain == -1: delete all non-referenced udc
* selected_chain < NF_BR_NUMHOOKS is illegal */
void ebt_delete_chain(struct ebt_u_replace *replace)
{
- int i;
-
if (replace->selected_chain != -1 && replace->selected_chain < NF_BR_NUMHOOKS)
ebt_print_bug("You can't remove a standard chain");
- if (replace->selected_chain == -1)
- for (i = NF_BR_NUMHOOKS; i < replace->num_chains; i++)
- ebt_delete_a_chain(replace, i, 0);
- else
+ if (replace->selected_chain == -1) {
+ int i = NF_BR_NUMHOOKS;
+
+ while (i < replace->num_chains)
+ if (ebt_delete_a_chain(replace, i, 0))
+ i++;
+ } else
ebt_delete_a_chain(replace, replace->selected_chain, 1);
}