chiark / gitweb /
networkd-wait-online: support globbing for ignored devices
[elogind.git] / src / network / networkd-wait-online-manager.c
index 6f392fe..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;
@@ -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;
                 }
 
@@ -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)