chiark / gitweb /
networkd: add support for Uplink Failure Detection
[elogind.git] / src / network / networkd-wait-online-manager.c
index c66470c3e27f275065d8492164b765f174d6f0bd..1c997a50a4b3f4c9790fb06d93f0ff67ca2b4201 100644 (file)
 
 #include <netinet/ether.h>
 #include <linux/if.h>
+#include <fnmatch.h>
 
 #include "rtnl-util.h"
 
-#include "network-util.h"
 #include "network-internal.h"
 #include "networkd-wait-online-link.h"
 #include "networkd-wait-online.h"
 
 #include "util.h"
+#include "time-util.h"
 
 bool manager_ignore_link(Manager *m, Link *link) {
+        char **ignore;
+
         assert(m);
         assert(link);
 
         if (link->flags & IFF_LOOPBACK)
                 return true;
 
-        if (strv_contains(m->ignore, link->ifname))
-                return true;
+        STRV_FOREACH(ignore, m->ignore)
+                if (fnmatch(*ignore, link->ifname, 0) == 0)
+                        return true;
 
         return false;
 }
@@ -258,7 +262,7 @@ static int manager_network_monitor_listen(Manager *m) {
         return 0;
 }
 
-int manager_new(Manager **ret, char **interfaces, char **ignore) {
+int manager_new(Manager **ret, char **interfaces, char **ignore, usec_t timeout) {
         _cleanup_(manager_freep) Manager *m = NULL;
         int r;
 
@@ -278,6 +282,16 @@ int manager_new(Manager **ret, char **interfaces, char **ignore) {
         sd_event_add_signal(m->event, NULL, SIGTERM, NULL,  NULL);
         sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
 
+        if (timeout > 0) {
+                usec_t usec;
+
+                usec = now(clock_boottime_or_monotonic()) + timeout;
+
+                r = sd_event_add_time(m->event, NULL, clock_boottime_or_monotonic(), usec, 0, NULL, INT_TO_PTR(-ETIMEDOUT));
+                if (r < 0)
+                        return r;
+        }
+
         sd_event_set_watchdog(m->event, true);
 
         r = manager_network_monitor_listen(m);