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}