Force fsync() after writing statefile
[project/firewall3.git] / utils.c
diff --git a/utils.c b/utils.c
index a728e77..fc8c201 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -357,6 +357,21 @@ write_defaults_uci(struct uci_context *ctx, struct fw3_defaults *d,
 
        uci_add_section(ctx, dest, "defaults", &ptr.s);
 
+       ptr.o      = NULL;
+       ptr.option = "input";
+       ptr.value  = fw3_flag_names[d->policy_input];
+       uci_set(ctx, &ptr);
+
+       ptr.o      = NULL;
+       ptr.option = "output";
+       ptr.value  = fw3_flag_names[d->policy_output];
+       uci_set(ctx, &ptr);
+
+       ptr.o      = NULL;
+       ptr.option = "forward";
+       ptr.value  = fw3_flag_names[d->policy_forward];
+       uci_set(ctx, &ptr);
+
        sprintf(buf, "0x%x", d->flags[0]);
        ptr.o      = NULL;
        ptr.option = "__flags_v4";
@@ -455,7 +470,10 @@ write_zone_uci(struct uci_context *ctx, struct fw3_zone *z,
                if (dev->invert)
                        p += sprintf(p, "!");
 
-               p += sprintf(p, "%s", dev->name);
+               if (*dev->network)
+                       p += sprintf(p, "%s@%s", dev->name, dev->network);
+               else
+                       p += sprintf(p, "%s", dev->name);
 
                ptr.value = buf;
                uci_add_list(ctx, &ptr);
@@ -496,7 +514,7 @@ write_ipset_uci(struct uci_context *ctx, struct fw3_ipset *s,
 
        struct uci_ptr ptr = { .p = dest };
 
-       if (!s->enabled || (s->external && *s->external))
+       if (!s->enabled || s->external)
                return;
 
        uci_add_section(ctx, dest, "ipset", &ptr.s);
@@ -584,6 +602,7 @@ fw3_write_statefile(void *state)
                        uci_unload(s->uci, p);
                }
 
+               fsync(fileno(sf));
                fclose(sf);
        }
 }
@@ -655,7 +674,7 @@ fw3_hotplug(bool add, void *zone, void *device)
        struct fw3_zone *z = zone;
        struct fw3_device *d = device;
 
-       if (!d->network)
+       if (!*d->network)
                return false;
 
        switch (fork())
@@ -679,7 +698,7 @@ fw3_hotplug(bool add, void *zone, void *device)
        clearenv();
        setenv("ACTION",    add ? "add" : "remove", 1);
        setenv("ZONE",      z->name,                1);
-       setenv("INTERFACE", d->network->name,       1);
+       setenv("INTERFACE", d->network,             1);
        setenv("DEVICE",    d->name,                1);
 
        execl(FW3_HOTPLUG, FW3_HOTPLUG, "firewall", NULL);