Xinqi Bao's Git

600fb86004c7f9e5e21943d9bfb31d516074f34b
[slstatus.git] / ip.c
1 #include <err.h>
2 #include <ifaddrs.h>
3 #include <netdb.h>
4 #include <stdio.h>
5 #include <string.h>
6
7 #include "util.h"
8
9 const char *
10 ipv4(const char *iface)
11 {
12 struct ifaddrs *ifaddr, *ifa;
13 int s;
14 char host[NI_MAXHOST];
15
16 if (getifaddrs(&ifaddr) == -1) {
17 warn("Failed to get IPv4 address for interface %s", iface);
18 return NULL;
19 }
20
21 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
22 if (ifa->ifa_addr == NULL) {
23 continue;
24 }
25 s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
26 if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET)) {
27 if (s != 0) {
28 warnx("Failed to get IPv4 address for interface %s", iface);
29 return NULL;
30 }
31 return bprintf("%s", host);
32 }
33 }
34
35 freeifaddrs(ifaddr);
36
37 return NULL;
38 }
39
40 const char *
41 ipv6(const char *iface)
42 {
43 struct ifaddrs *ifaddr, *ifa;
44 int s;
45 char host[NI_MAXHOST];
46
47 if (getifaddrs(&ifaddr) == -1) {
48 warn("Failed to get IPv6 address for interface %s", iface);
49 return NULL;
50 }
51
52 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
53 if (ifa->ifa_addr == NULL) {
54 continue;
55 }
56 s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
57 if ((strcmp(ifa->ifa_name, iface) == 0) && (ifa->ifa_addr->sa_family == AF_INET6)) {
58 if (s != 0) {
59 warnx("Failed to get IPv6 address for interface %s", iface);
60 return NULL;
61 }
62 return bprintf("%s", host);
63 }
64 }
65
66 freeifaddrs(ifaddr);
67
68 return NULL;
69 }