Fix cleanup of interfaces
[project/odhcpd.git] / src / config.c
index 06e5407..6c09541 100644 (file)
@@ -273,8 +273,6 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
                iface = calloc(1, sizeof(*iface));
                strncpy(iface->name, name, sizeof(iface->name) - 1);
                list_add(&iface->head, &interfaces);
-       } else if (overwrite) {
-               clean_interface(iface);
        }
 
        const char *ifname = NULL;
@@ -298,9 +296,6 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
 
        iface->inuse = true;
 
-       if (overwrite)
-               clean_interface(iface);
-
        if ((c = tb[IFACE_ATTR_DYNAMICDHCP]))
                iface->no_dynamic_dhcp = !blobmsg_get_bool(c);
 
@@ -503,6 +498,10 @@ void odhcpd_reload(void)
                free(l);
        }
 
+       struct interface *master = NULL, *i, *n;
+       list_for_each_entry(i, &interfaces, head)
+               clean_interface(i);
+
        struct uci_package *dhcp = NULL;
        if (!uci_load(uci, "dhcp", &dhcp)) {
                struct uci_element *e;
@@ -521,12 +520,12 @@ void odhcpd_reload(void)
                }
        }
 
+
 #ifdef WITH_UBUS
        ubus_apply_network();
 #endif
 
        // Evaluate hybrid mode for master
-       struct interface *master = NULL, *i, *n;
        list_for_each_entry(i, &interfaces, head) {
                if (!i->master)
                        continue;
@@ -570,7 +569,6 @@ void odhcpd_reload(void)
                        setup_dhcpv6_interface(i, true);
                        setup_ndp_interface(i, true);
                        setup_dhcpv4_interface(i, true);
-                       i->inuse = false;
                } else {
                        close_interface(i);
                }
@@ -612,7 +610,8 @@ void odhcpd_run(void)
        signal(SIGHUP, handle_signal);
 
 #ifdef WITH_UBUS
-       init_ubus();
+       while (init_ubus())
+               sleep(1);
 #endif
 
        odhcpd_reload();