X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Ffirst_network_device.c;h=3d06217fdde789eb40c3309e732e3c3b735fdfc1;hb=a57cdc84e2f38ea99fd464d8b5b6446c769cc545;hp=593238531223bd401696d94d9cc3e389db05a7d2;hpb=3c6d5ac3d7a9f83031ae468fcc5eec6686c516de;p=i3%2Fi3status diff --git a/src/first_network_device.c b/src/first_network_device.c index 5932385..3d06217 100644 --- a/src/first_network_device.c +++ b/src/first_network_device.c @@ -1,23 +1,28 @@ // vim:ts=4:sw=4:expandtab +#include #include #include #include #include -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__DragonFly__) #include #include #include #include +#endif +#if defined(__OpenBSD__) #include #include +#elif defined(__DragonFly__) +#include #endif #include "i3status.h" -#ifdef __linux__ -#define LOOPBACK_DEV "lo" -#else +#ifdef __OpenBSD__ #define LOOPBACK_DEV "lo0" +#else +#define LOOPBACK_DEV "lo" #endif static bool sysfs_devtype(char *dest, size_t n, const char *ifnam) { @@ -50,24 +55,24 @@ static bool sysfs_devtype(char *dest, size_t n, const char *ifnam) { return true; } -static net_type_t iface_type(const char *ifname) { -#ifdef __linux__ - char devtype[32]; - - if (!sysfs_devtype(devtype, sizeof(devtype), ifname)) - return NET_TYPE_OTHER; - - if (!devtype[0]) - return NET_TYPE_ETHERNET; +static bool is_virtual(const char *ifname) { + char path[1024]; + char *target = NULL; + bool is_virtual = false; - if (strcmp(devtype, "wlan") == 0) - return NET_TYPE_WIRELESS; + snprintf(path, sizeof(path), "/sys/class/net/%s", ifname); + if ((target = realpath(path, NULL))) { + if (BEGINS_WITH(target, "/sys/devices/virtual/")) { + is_virtual = true; + } + } - if (strcmp(devtype, "wwan") == 0) - return NET_TYPE_OTHER; + free(target); + return is_virtual; +} - return NET_TYPE_OTHER; -#elif __OpenBSD__ +static net_type_t iface_type(const char *ifname) { +#if defined(__OpenBSD__) /* *First determine if the device is a wireless device by trying two ioctl(2) * commands against it. If either succeeds we can be sure it's a wireless @@ -78,14 +83,23 @@ static net_type_t iface_type(const char *ifname) { struct ifreq ifr; struct ieee80211_bssid bssid; struct ieee80211_nwid nwid; +#elif defined(__DragonFly__) + struct ieee80211req ifr; +#endif +#if defined(__OpenBSD__) || defined(__DragonFly__) struct ifmediareq ifmr; - - int s, ibssid, inwid; - + int s; +#endif +#if defined(__OpenBSD__) + int ibssid, inwid; +#endif +#if defined(__OpenBSD__) || defined(__DragonFly__) if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) return NET_TYPE_OTHER; memset(&ifr, 0, sizeof(ifr)); +#endif +#if defined(__OpenBSD__) ifr.ifr_data = (caddr_t)&nwid; (void)strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); inwid = ioctl(s, SIOCG80211NWID, (caddr_t)&ifr); @@ -98,7 +112,15 @@ static net_type_t iface_type(const char *ifname) { close(s); return NET_TYPE_WIRELESS; } - +#elif defined(__DragonFly__) + (void)strlcpy(ifr.i_name, ifname, sizeof(ifr.i_name)); + ifr.i_type = IEEE80211_IOC_NUMSSIDS; + if (ioctl(s, SIOCG80211, &ifr) == 0) { + close(s); + return NET_TYPE_WIRELESS; + } +#endif +#if defined(__OpenBSD__) || defined(__DragonFly__) (void)memset(&ifmr, 0, sizeof(ifmr)); (void)strlcpy(ifmr.ifm_name, ifname, sizeof(ifmr.ifm_name)); @@ -110,8 +132,24 @@ static net_type_t iface_type(const char *ifname) { return NET_TYPE_ETHERNET; } #else -#error Missing implementation to determine interface type. + char devtype[32]; + + 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; + + if (strcmp(devtype, "wlan") == 0) + return NET_TYPE_WIRELESS; + + if (strcmp(devtype, "wwan") == 0) + return NET_TYPE_OTHER; + + return NET_TYPE_OTHER; #endif + return NET_TYPE_OTHER; } const char *first_eth_interface(const net_type_t type) { @@ -147,6 +185,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; }