chiark / gitweb /
networkd-wait-online: add missing short option 'i' to optstring
[elogind.git] / src / network / networkd-link.c
index 76e642758d5b14e7d532e26e17cf5651b7d0f5e7..dff3270f2a5a6b92f1c99a0cd4f32f38bd6a4ef9 100644 (file)
@@ -1052,7 +1052,6 @@ static int link_joined(Link *link) {
         int r;
 
         assert(link);
-        assert(link->state == LINK_STATE_ENSLAVING);
         assert(link->network);
 
         if (!(link->flags & IFF_UP)) {
@@ -1072,8 +1071,6 @@ static int netdev_join_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
         int r;
 
         assert(link);
-        assert(IN_SET(link->state, LINK_STATE_ENSLAVING, LINK_STATE_FAILED,
-                      LINK_STATE_LINGER));
         assert(link->network);
 
         link->enslaving --;
@@ -1389,6 +1386,13 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
                 return 0;
         }
 
+        r = sd_rtnl_message_addr_get_flags(message, &address->flags);
+        if (r < 0) {
+                log_warning_link(link,
+                                 "rtnl: received address with invalid flags, ignoring");
+                return 0;
+        }
+
         switch (address->family) {
         case AF_INET:
                 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL,
@@ -1661,6 +1665,9 @@ static void link_update_operstate(Link *link) {
 
                 /* if we have carrier, check what addresses we have */
                 LIST_FOREACH(addresses, address, link->addresses) {
+                        if (address->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED))
+                                continue;
+
                         if (address->scope < scope)
                                 scope = address->scope;
                 }
@@ -1721,10 +1728,17 @@ int link_save(Link *link) {
                 admin_state, oper_state);
 
         if (link->network) {
-                char **address;
-                char **domain;
+                char **address, **domain;
+                bool space;
 
                 fputs("DNS=", f);
+                space = false;
+                STRV_FOREACH(address, link->network->dns) {
+                        if (space)
+                                fputc(' ', f);
+                        fputs(*address, f);
+                        space = true;
+                }
 
                 if (link->network->dhcp_dns &&
                     link->dhcp_lease) {
@@ -1732,19 +1746,22 @@ int link_save(Link *link) {
 
                         r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
                         if (r > 0) {
+                                if (space)
+                                        fputc(' ', f);
                                 serialize_in_addrs(f, addresses, r);
-                                if (link->network->dns)
-                                        fputs(" ", f);
                         }
                 }
 
-                STRV_FOREACH(address, link->network->dns)
-                        fprintf(f, "%s%s", *address,
-                                (address + 1 ? " " : ""));
-
                 fputs("\n", f);
 
                 fprintf(f, "NTP=");
+                space = false;
+                STRV_FOREACH(address, link->network->ntp) {
+                        if (space)
+                                fputc(' ', f);
+                        fputs(*address, f);
+                        space = true;
+                }
 
                 if (link->network->dhcp_ntp &&
                     link->dhcp_lease) {
@@ -1752,19 +1769,22 @@ int link_save(Link *link) {
 
                         r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
                         if (r > 0) {
+                                if (space)
+                                        fputc(' ', f);
                                 serialize_in_addrs(f, addresses, r);
-                                if (link->network->ntp)
-                                        fputs(" ", f);
                         }
                 }
 
-                STRV_FOREACH(address, link->network->ntp)
-                        fprintf(f, "%s%s", *address,
-                                (address + 1 ? " " : ""));
-
                 fputs("\n", f);
 
                 fprintf(f, "DOMAINS=");
+                space = false;
+                STRV_FOREACH(domain, link->network->domains) {
+                        if (space)
+                                fputc(' ', f);
+                        fputs(*domain, f);
+                        space = true;
+                }
 
                 if (link->network->dhcp_domains &&
                     link->dhcp_lease) {
@@ -1772,16 +1792,12 @@ int link_save(Link *link) {
 
                         r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
                         if (r >= 0) {
+                                if (space)
+                                        fputc(' ', f);
                                 fputs(domainname, f);
-                                if (link->network->domains)
-                                        fputs(" ", f);
                         }
                 }
 
-                STRV_FOREACH(domain, link->network->domains)
-                        fprintf(f, "%s%s", *domain,
-                                (domain + 1 ? " " : ""));
-
                 fputs("\n", f);
 
                 fprintf(f, "WILDCARD_DOMAIN=%s\n",