]> git.sur5r.net Git - i3/i3status/commitdiff
Add check for virtual ethernet devices
authorFabian Franzen <fabian.franzen@tum.de>
Wed, 12 Apr 2017 01:30:28 +0000 (03:30 +0200)
committerFabian Franzen <fabian.franzen@tum.de>
Wed, 12 Apr 2017 01:46:04 +0000 (03:46 +0200)
The _first_ option for ethernet devices now uses the link in sysfs to determine
if it's a real device or just a virtual one (i.e veth** devices created by docker).

src/first_network_device.c

index 593238531223bd401696d94d9cc3e389db05a7d2..abbc9b004141b1722292e1f013f41cbf566acb56 100644 (file)
@@ -50,6 +50,21 @@ static bool sysfs_devtype(char *dest, size_t n, const char *ifnam) {
     return true;
 }
 
+static bool is_virtual(const char *ifname) {
+    char path[1024];
+    char *target = NULL;
+    const char virtual_template[] = "/sys/devices/virtual/";
+
+    snprintf(path, sizeof(path), "/sys/class/net/%s", ifname);
+    if ((target = realpath(path, NULL))) {
+        if (strncmp(virtual_template, target, strlen(virtual_template)) == 0)
+            return true;
+    }
+    free(target);
+
+    return false;
+}
+
 static net_type_t iface_type(const char *ifname) {
 #ifdef __linux__
     char devtype[32];
@@ -57,6 +72,7 @@ static net_type_t iface_type(const char *ifname) {
     if (!sysfs_devtype(devtype, sizeof(devtype), ifname))
         return NET_TYPE_OTHER;
 
+    /* Default to Ethernet when no devtype is available */
     if (!devtype[0])
         return NET_TYPE_ETHERNET;
 
@@ -147,6 +163,8 @@ const char *first_eth_interface(const net_type_t type) {
         iftype = iface_type(addrp->ifa_name);
         if (iftype != type)
             continue;
+        if (is_virtual(addrp->ifa_name))
+            continue;
         interface = strdup(addrp->ifa_name);
         break;
     }