Only update resolv.conf if changed (avoid logspam)
[project/netifd.git] / interface.c
index fddb861..b304e00 100644 (file)
@@ -79,8 +79,7 @@ void interface_add_error(struct interface *iface, const char *subsystem,
        struct interface_error *error;
        int i, len = 0;
        int *datalen = NULL;
-       char *dest;
-       int subsystem_len = 0, code_len = 0;
+       char *dest, *d_subsys, *d_code;
 
        if (n_data) {
                len = n_data * sizeof(char *);
@@ -91,17 +90,9 @@ void interface_add_error(struct interface *iface, const char *subsystem,
                }
        }
 
-       if (subsystem) {
-               subsystem_len = strlen(subsystem) + 1;
-               len += subsystem_len;
-       }
-
-       if (code) {
-               code_len = strlen(code) + 1;
-               len += code_len;
-       }
-
-       error = calloc(1, sizeof(*error) + sizeof(char *) + len);
+       error = calloc_a(sizeof(*error) + sizeof(char *) + len,
+               &d_subsys, subsystem ? strlen(subsystem) + 1 : 0,
+               &d_code, code ? strlen(code) + 1 : 0);
        if (!error)
                return;
 
@@ -115,18 +106,11 @@ void interface_add_error(struct interface *iface, const char *subsystem,
        }
        error->data[n_data++] = NULL;
 
-       dest = (char *) &error->data[n_data];
-       if (subsystem) {
-               error->subsystem = dest;
-               strcpy(dest, subsystem);
-               dest += subsystem_len;
-       }
+       if (subsystem)
+               error->subsystem = strcpy(d_subsys, subsystem);
 
-       if (code) {
-               error->code = dest;
-               strcpy(dest, code);
-               dest += code_len;
-       }
+       if (code)
+               error->code = strcpy(d_code, code);
 }
 
 static void
@@ -179,7 +163,7 @@ interface_event(struct interface *iface, enum interface_event ev)
 
        switch (ev) {
        case IFEV_UP:
-               adev = iface->main_dev.dev;
+               adev = iface->l3_dev.dev;
                /* fall through */
        case IFEV_DOWN:
                alias_notify_device(iface->name, adev);
@@ -214,8 +198,6 @@ mark_interface_down(struct interface *iface)
 void
 __interface_set_down(struct interface *iface, bool force)
 {
-       interface_clear_errors(iface);
-
        if (iface->state == IFS_DOWN ||
                iface->state == IFS_TEARDOWN)
                return;
@@ -339,9 +321,16 @@ interface_claim_device(struct interface *iface)
                interface_set_available(iface, true);
 }
 
+static void
+interface_cleanup_state(struct interface *iface)
+{
+       interface_flush_state(iface);
+       interface_clear_errors(iface);
+       interface_set_proto_state(iface, NULL);
+}
 
 static void
-interface_cleanup(struct interface *iface, bool reload)
+interface_cleanup(struct interface *iface)
 {
        struct interface_user *dep, *tmp;
 
@@ -352,19 +341,17 @@ interface_cleanup(struct interface *iface, bool reload)
                interface_remove_user(dep);
 
        interface_ip_flush(&iface->config_ip);
-       interface_flush_state(iface);
-       interface_clear_errors(iface);
-
-       if (iface->main_dev.dev && !reload)
+       if (iface->main_dev.dev)
                interface_set_main_dev(iface, NULL);
-       interface_set_proto_state(iface, NULL);
+
+       interface_cleanup_state(iface);
 }
 
 static void
 interface_do_free(struct interface *iface)
 {
        interface_event(iface, IFEV_FREE);
-       interface_cleanup(iface, false);
+       interface_cleanup(iface);
        free(iface->config);
        netifd_ubus_remove_interface(iface);
        avl_delete(&interfaces.avl, &iface->node.avl);
@@ -375,7 +362,7 @@ static void
 interface_do_reload(struct interface *iface)
 {
        interface_event(iface, IFEV_RELOAD);
-       interface_cleanup(iface, true);
+       interface_cleanup_state(iface);
        proto_init_interface(iface, iface->config);
        interface_claim_device(iface);
 }
@@ -725,6 +712,9 @@ interface_change_config(struct interface *if_old, struct interface *if_new)
        if_old->parent_ifname = if_new->parent_ifname;
        if_old->proto_handler = if_new->proto_handler;
 
+       if_old->proto_ip.no_dns = if_new->proto_ip.no_dns;
+       interface_replace_dns(&if_old->config_ip, &if_new->config_ip);
+
 #define FIELD_CHANGED_STR(field)                                       \
                ((!!if_old->field != !!old_ ## field) ||                \
                 (old_ ## field &&                                      \
@@ -765,8 +755,6 @@ interface_change_config(struct interface *if_old, struct interface *if_new)
                interface_ip_set_enabled(&if_old->proto_ip, if_new->proto_ip.enabled);
        }
 
-       UPDATE(proto_ip.no_dns);
-       interface_replace_dns(&if_old->config_ip, &if_new->config_ip);
        interface_write_resolv_conf();
 
 #undef UPDATE
@@ -777,7 +765,7 @@ reload:
        set_config_state(if_old, IFC_RELOAD);
 out:
        if_new->config = NULL;
-       interface_cleanup(if_new, false);
+       interface_cleanup(if_new);
        free(old_config);
        free(if_new);
 }