r = fw3_ipt_rule_new(handle);
fw3_ipt_rule_target(r, tr->target);
- fw3_ipt_rule_append(r, tr->chain);
+ fw3_ipt_rule_replace(r, tr->chain);
}
switch (handle->table)
{
r = fw3_ipt_rule_new(handle);
fw3_ipt_rule_comment(r, "user chain for %s", chains[i+1]);
- fw3_ipt_rule_target(r, chains[i+1]);
+ fw3_ipt_rule_target(r, "%s_rule", chains[i+1]);
fw3_ipt_rule_append(r, chains[i]);
}
}
if (c->table != handle->table)
continue;
- if (c->flag &&
- !hasbit(defs->flags[handle->family == FW3_FAMILY_V6], c->flag))
+ if (c->flag && !has(defs->flags, handle->family, c->flag))
+ continue;
+
+ fw3_ipt_flush_chain(handle, c->format);
+
+ /* keep certain basic chains that do not depend on any settings to
+ avoid purging unrelated user rules pointing to them */
+ if (reload && !c->flag)
continue;
- fw3_ipt_delete_rules(handle, c->format);
fw3_ipt_delete_chain(handle, c->format);
}