slstatus

status monitor
git clone git://git.suckless.org/slstatus
Log | Files | Refs | README | LICENSE

ip.c (1743B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <ifaddrs.h>
      3 #include <netdb.h>
      4 #include <net/if.h>
      5 #include <stdio.h>
      6 #include <string.h>
      7 #if defined(__OpenBSD__)
      8 	#include <sys/socket.h>
      9 	#include <sys/types.h>
     10 #elif defined(__FreeBSD__)
     11 	#include <netinet/in.h>
     12 	#include <sys/socket.h>
     13 #endif
     14 
     15 #include "../slstatus.h"
     16 #include "../util.h"
     17 
     18 static const char *
     19 ip(const char *interface, unsigned short sa_family)
     20 {
     21 	struct ifaddrs *ifaddr, *ifa;
     22 	int s;
     23 	char host[NI_MAXHOST];
     24 
     25 	if (getifaddrs(&ifaddr) < 0) {
     26 		warn("getifaddrs:");
     27 		return NULL;
     28 	}
     29 
     30 	for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
     31 		if (!ifa->ifa_addr)
     32 			continue;
     33 		if (strcmp(ifa->ifa_name, interface) ||
     34 		    ifa->ifa_addr->sa_family != sa_family)
     35 			continue;
     36 
     37 		s = getnameinfo(ifa->ifa_addr,
     38 		                (sa_family == AF_INET) ? sizeof(struct sockaddr_in)
     39 		                                       : sizeof(struct sockaddr_in6),
     40 		                host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
     41 		freeifaddrs(ifaddr);
     42 		if (s != 0) {
     43 			warn("getnameinfo: %s", gai_strerror(s));
     44 			return NULL;
     45 		}
     46 		return bprintf("%s", host);
     47 	}
     48 
     49 	freeifaddrs(ifaddr);
     50 
     51 	return NULL;
     52 }
     53 
     54 const char *
     55 ipv4(const char *interface)
     56 {
     57 	return ip(interface, AF_INET);
     58 }
     59 
     60 const char *
     61 ipv6(const char *interface)
     62 {
     63 	return ip(interface, AF_INET6);
     64 }
     65 
     66 const char *
     67 up(const char *interface)
     68 {
     69 	struct ifaddrs *ifaddr, *ifa;
     70 
     71 	if (getifaddrs(&ifaddr) < 0) {
     72 		warn("getifaddrs:");
     73 		return NULL;
     74 	}
     75 
     76 	for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
     77 		if (!ifa->ifa_addr)
     78 			continue;
     79 
     80 		if (!strcmp(ifa->ifa_name, interface)) {
     81 			freeifaddrs(ifaddr);
     82 			return ifa->ifa_flags & IFF_UP ? "up" : "down";
     83 		}
     84 	}
     85 
     86 	freeifaddrs(ifaddr);
     87 
     88 	return NULL;
     89 }