chiark / gitweb /
networkd-wait-online: support globbing for ignored devices
[elogind.git] / src / network / networkd-wait-online-manager.c
index 6e3ec69..d127372 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <netinet/ether.h>
 #include <linux/if.h>
+#include <fnmatch.h>
 
 #include "rtnl-util.h"
 
 
 #include "util.h"
 
+bool manager_ignore_link(Manager *m, Link *link) {
+        char **ignore;
+
+        assert(m);
+        assert(link);
+
+        if (link->flags & IFF_LOOPBACK)
+                return true;
+
+        STRV_FOREACH(ignore, m->ignore)
+                if (fnmatch(*ignore, link->ifname, 0) == 0)
+                        return true;
+
+        return false;
+}
+
 bool manager_all_configured(Manager *m) {
         Iterator i;
         Link *l;
         char **ifname;
         bool one_ready = false;
 
-        /* wait for all the links given on the commandline to appear */
+        /* wait for all the links given on the command line to appear */
         STRV_FOREACH(ifname, m->interfaces) {
                 l = hashmap_get(m->links_by_name, *ifname);
                 if (!l) {
@@ -49,8 +66,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) {
-                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;
                 }
 
@@ -134,7 +151,7 @@ static int manager_process_link(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userda
         return 0;
 
 fail:
-        log_warning("Failed to process RTNL link message: %s", strerror(-r));
+        log_warning_errno(r, "Failed to process RTNL link message: %m");
         return 0;
 }
 
@@ -159,7 +176,7 @@ static int manager_rtnl_listen(Manager *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;
@@ -211,7 +228,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)
-                        log_warning("Failed to update monitor information for %i: %s", l->ifindex, strerror(-r));
+                        log_warning_errno(r, "Failed to update monitor information for %i: %m", l->ifindex);
         }
 
         if (manager_all_configured(m))
@@ -245,7 +262,7 @@ static int manager_network_monitor_listen(Manager *m) {
         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;
 
@@ -256,6 +273,7 @@ int manager_new(Manager **ret, char **interfaces) {
                 return -ENOMEM;
 
         m->interfaces = interfaces;
+        m->ignore = ignore;
 
         r = sd_event_default(&m->event);
         if (r < 0)