2015-03-16 09:00:32 +00:00
|
|
|
// vim:ts=4:sw=4:expandtab
|
2014-12-07 14:14:02 +00:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <ifaddrs.h>
|
|
|
|
|
|
|
|
#include "i3status.h"
|
|
|
|
|
|
|
|
const char *first_eth_interface(const net_type_t type) {
|
2015-03-16 09:00:32 +00:00
|
|
|
static char *interface = NULL;
|
|
|
|
struct ifaddrs *ifaddr, *addrp;
|
|
|
|
struct stat stbuf;
|
|
|
|
static char path[1024];
|
2014-12-07 14:14:02 +00:00
|
|
|
|
2015-03-16 09:00:32 +00:00
|
|
|
getifaddrs(&ifaddr);
|
2014-12-07 14:14:02 +00:00
|
|
|
|
2015-03-16 09:00:32 +00:00
|
|
|
if (ifaddr == NULL)
|
|
|
|
return NULL;
|
2014-12-07 14:14:02 +00:00
|
|
|
|
2015-03-16 09:00:32 +00:00
|
|
|
free(interface);
|
|
|
|
interface = NULL;
|
|
|
|
for (addrp = ifaddr;
|
|
|
|
addrp != NULL;
|
|
|
|
addrp = addrp->ifa_next) {
|
|
|
|
if (strncasecmp("lo", addrp->ifa_name, strlen("lo")) == 0)
|
|
|
|
continue;
|
|
|
|
// Skip this interface if it is a wireless interface.
|
|
|
|
snprintf(path, sizeof(path), "/sys/class/net/%s/wireless", addrp->ifa_name);
|
|
|
|
const bool is_wireless = (stat(path, &stbuf) == 0);
|
|
|
|
if ((is_wireless && type == NET_TYPE_ETHERNET) ||
|
|
|
|
(!is_wireless && type == NET_TYPE_WIRELESS))
|
|
|
|
continue;
|
|
|
|
interface = strdup(addrp->ifa_name);
|
|
|
|
break;
|
|
|
|
}
|
2014-12-07 14:14:02 +00:00
|
|
|
|
2015-03-16 09:00:32 +00:00
|
|
|
freeifaddrs(ifaddr);
|
|
|
|
return interface;
|
2014-12-07 14:14:02 +00:00
|
|
|
}
|