chiark / gitweb /
networkd-wait-online: allow specific devices to be ignored
[elogind.git] / src / network / networkd-wait-online-manager.c
index 0cdc4f8811f1fb3b0574528a90fa0105142bcb20..c66470c3e27f275065d8492164b765f174d6f0bd 100644 (file)
 
 #include "util.h"
 
 
 #include "util.h"
 
+bool manager_ignore_link(Manager *m, Link *link) {
+        assert(m);
+        assert(link);
+
+        if (link->flags & IFF_LOOPBACK)
+                return true;
+
+        if (strv_contains(m->ignore, link->ifname))
+                return true;
+
+        return false;
+}
+
 bool manager_all_configured(Manager *m) {
         Iterator i;
         Link *l;
 bool manager_all_configured(Manager *m) {
         Iterator i;
         Link *l;
@@ -49,8 +62,8 @@ bool manager_all_configured(Manager *m) {
         /* wait for all links networkd manages to be in admin state 'configured'
            and at least one link to gain a carrier */
         HASHMAP_FOREACH(l, m->links, i) {
         /* wait for all links networkd manages to be in admin state 'configured'
            and at least one link to gain a carrier */
         HASHMAP_FOREACH(l, m->links, i) {
-                if (!link_relevant(l)) {
-                        log_info("ignore irrelevant link: %s", l->ifname);
+                if (manager_ignore_link(m, l)) {
+                        log_info("ignoring: %s", l->ifname);
                         continue;
                 }
 
                         continue;
                 }
 
@@ -134,7 +147,7 @@ static int manager_process_link(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userda
         return 0;
 
 fail:
         return 0;
 
 fail:
-        log_warning_errno(-r, "Failed to process RTNL link message: %m");
+        log_warning_errno(r, "Failed to process RTNL link message: %m");
         return 0;
 }
 
         return 0;
 }
 
@@ -159,7 +172,7 @@ static int manager_rtnl_listen(Manager *m) {
 
         assert(m);
 
 
         assert(m);
 
-        /* First, subscibe to interfaces coming and going */
+        /* First, subscribe to interfaces coming and going */
         r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
         if (r < 0)
                 return r;
         r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
         if (r < 0)
                 return r;
@@ -211,7 +224,7 @@ static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *
         HASHMAP_FOREACH(l, m->links, i) {
                 r = link_update_monitor(l);
                 if (r < 0)
         HASHMAP_FOREACH(l, m->links, i) {
                 r = link_update_monitor(l);
                 if (r < 0)
-                        log_warning_errno(-r, "Failed to update monitor information for %i: %m", l->ifindex);
+                        log_warning_errno(r, "Failed to update monitor information for %i: %m", l->ifindex);
         }
 
         if (manager_all_configured(m))
         }
 
         if (manager_all_configured(m))
@@ -245,7 +258,7 @@ static int manager_network_monitor_listen(Manager *m) {
         return 0;
 }
 
         return 0;
 }
 
-int manager_new(Manager **ret, char **interfaces) {
+int manager_new(Manager **ret, char **interfaces, char **ignore) {
         _cleanup_(manager_freep) Manager *m = NULL;
         int r;
 
         _cleanup_(manager_freep) Manager *m = NULL;
         int r;
 
@@ -256,6 +269,7 @@ int manager_new(Manager **ret, char **interfaces) {
                 return -ENOMEM;
 
         m->interfaces = interfaces;
                 return -ENOMEM;
 
         m->interfaces = interfaces;
+        m->ignore = ignore;
 
         r = sd_event_default(&m->event);
         if (r < 0)
 
         r = sd_event_default(&m->event);
         if (r < 0)