Don't track family of ipsets
[project/firewall3.git] / utils.c
diff --git a/utils.c b/utils.c
index 3ad50e3..aef1cc6 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -352,18 +352,18 @@ static void
 write_defaults_uci(struct uci_context *ctx, struct fw3_defaults *d,
                    struct uci_package *dest)
 {
-       char buf[8];
+       char buf[sizeof("0xffffffff\0")];
        struct uci_ptr ptr = { .p = dest };
 
        uci_add_section(ctx, dest, "defaults", &ptr.s);
 
-       sprintf(buf, "%u", d->flags[0]);
+       sprintf(buf, "0x%x", d->flags[0]);
        ptr.o      = NULL;
        ptr.option = "__flags_v4";
        ptr.value  = buf;
        uci_set(ctx, &ptr);
 
-       sprintf(buf, "%u", d->flags[1]);
+       sprintf(buf, "0x%x", d->flags[1]);
        ptr.o      = NULL;
        ptr.option = "__flags_v6";
        ptr.value  = buf;
@@ -473,13 +473,44 @@ write_zone_uci(struct uci_context *ctx, struct fw3_zone *z,
                uci_add_list(ctx, &ptr);
        }
 
-       sprintf(buf, "%u", z->flags[0]);
+       sprintf(buf, "0x%x", z->flags[0]);
        ptr.o      = NULL;
        ptr.option = "__flags_v4";
        ptr.value  = buf;
        uci_set(ctx, &ptr);
 
-       sprintf(buf, "%u", z->flags[1]);
+       sprintf(buf, "0x%x", z->flags[1]);
+       ptr.o      = NULL;
+       ptr.option = "__flags_v6";
+       ptr.value  = buf;
+       uci_set(ctx, &ptr);
+}
+
+static void
+write_ipset_uci(struct uci_context *ctx, struct fw3_ipset *s,
+                struct uci_package *dest)
+{
+       char buf[sizeof("0xffffffff\0")];
+
+       struct uci_ptr ptr = { .p = dest };
+
+       if (!s->enabled || (s->external && *s->external))
+               return;
+
+       uci_add_section(ctx, dest, "ipset", &ptr.s);
+
+       ptr.o      = NULL;
+       ptr.option = "name";
+       ptr.value  = s->name;
+       uci_set(ctx, &ptr);
+
+       sprintf(buf, "0x%x", s->flags[0]);
+       ptr.o      = NULL;
+       ptr.option = "__flags_v4";
+       ptr.value  = buf;
+       uci_set(ctx, &ptr);
+
+       sprintf(buf, "0x%x", s->flags[1]);
        ptr.o      = NULL;
        ptr.option = "__flags_v6";
        ptr.value  = buf;
@@ -492,6 +523,7 @@ fw3_write_statefile(void *state)
        FILE *sf;
        struct fw3_state *s = state;
        struct fw3_zone *z;
+       struct fw3_ipset *i;
 
        struct uci_package *p;
 
@@ -522,6 +554,9 @@ fw3_write_statefile(void *state)
                        list_for_each_entry(z, &s->zones, list)
                                write_zone_uci(s->uci, z, p);
 
+                       list_for_each_entry(i, &s->ipsets, list)
+                               write_ipset_uci(s->uci, i, p);
+
                        uci_export(s->uci, sf, p, true);
                        uci_unload(s->uci, p);
                }