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;
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;
FILE *sf;
struct fw3_state *s = state;
struct fw3_zone *z;
+ struct fw3_ipset *i;
struct uci_package *p;
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);
}