X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffirewall3.git;a=blobdiff_plain;f=ipsets.c;h=5e0d61f9c3f956c23c542b533fdda8884e31b70f;hp=6d7ff78bd753d5864c0a23170038c3ada1c7749f;hb=bb6873d86322a66bc01fc4195512ba5d2c78bddb;hpb=a32e331a11034403df2e26807df9195435b6fb8a diff --git a/ipsets.c b/ipsets.c index 6d7ff78..5e0d61f 100644 --- a/ipsets.c +++ b/ipsets.c @@ -263,16 +263,10 @@ create_ipset(struct fw3_ipset *ipset) "set", }; - const char *families[] = { - "(bug)", - "inet", - "inet6", - }; - if (ipset->external && *ipset->external) return; - info(" * %s", ipset->name); + info("Creating ipset %s", ipset->name); first = true; fw3_pr("create %s %s", ipset->name, methods[ipset->method]); @@ -317,7 +311,7 @@ create_ipset(struct fw3_ipset *ipset) } if (ipset->family != FW3_FAMILY_ANY) - fw3_pr(" family %s", families[ipset->family]); + fw3_pr(" family inet%s", (ipset->family == FW3_FAMILY_V4) ? "" : "6"); if (ipset->timeout > 0) fw3_pr(" timeout %u", ipset->timeout); @@ -334,54 +328,74 @@ create_ipset(struct fw3_ipset *ipset) fw3_pr("\n"); } +static bool +ipset_loaded(struct list_head *statefile, const char *name) +{ + struct fw3_statefile_entry *e; + int mask = (1 << FW3_FAMILY_V4) | (1 << FW3_FAMILY_V6); + + if (!statefile) + return false; + + list_for_each_entry(e, statefile, list) + { + if (e->type != FW3_TYPE_IPSET) + continue; + + if (!strcmp(e->name, name) && (e->flags[0] & mask)) + return true; + } + + return false; +} + void -fw3_create_ipsets(struct fw3_state *state) +fw3_create_ipsets(struct fw3_state *state, struct list_head *statefile) { struct fw3_ipset *ipset; if (state->disable_ipsets) return; - info("Initializing ipsets ..."); - list_for_each_entry(ipset, &state->ipsets, list) - create_ipset(ipset); + if (!ipset_loaded(statefile, ipset->name)) + create_ipset(ipset); fw3_pr("quit\n"); } void -fw3_destroy_ipsets(struct fw3_state *state) +fw3_destroy_ipsets(struct fw3_state *state, struct list_head *statefile) { - FILE *sf; + struct fw3_ipset *s; + struct fw3_statefile_entry *e; + int mask = (1 << FW3_FAMILY_V4) | (1 << FW3_FAMILY_V6); - char *p; - char line[128]; - - sf = fopen(FW3_STATEFILE, "r"); - - if (!sf) + if (!statefile) return; - info("Destroying ipsets ..."); - - while (fgets(line, sizeof(line), sf)) + list_for_each_entry(e, statefile, list) { - if (strncmp(line, "ipset ", 6)) + if (e->type != FW3_TYPE_IPSET) continue; - p = strtok(line+6, " \t\n"); + if (!hasbit(state->defaults.flags, FW3_FAMILY_V4)) + delbit(e->flags[0], FW3_FAMILY_V4); - if (!p || !strlen(p)) - continue; + if (!hasbit(state->defaults.flags, FW3_FAMILY_V6)) + delbit(e->flags[0], FW3_FAMILY_V6); - info(" * %s", p); + if ((s = fw3_lookup_ipset(state, e->name)) != NULL) + s->flags = e->flags[0]; - fw3_pr("flush %s\n", p); - fw3_pr("destroy %s\n", p); - } + if (!(e->flags[0] & mask)) + { + info("Deleting ipset %s", e->name); - fw3_pr("quit\n"); + fw3_pr("flush %s\n", e->name); + fw3_pr("destroy %s\n", e->name); + } + } } void