suckless/slstatus

components/ip.c in master
Repositories | Summary | Log | Files | README | LICENSE

ip.c (1207B) download


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