blob: f362ba695d1eb0b992624e54e168d8feca2dbc30 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include "net.h"
static uint8_t is_loopback(struct sockaddr_in *addr)
{
return (addr->sin_addr.s_addr & 0xFF) == 127;
}
static void format_address(uint8_t *dst, struct sockaddr_in *addr)
{
long ip = addr->sin_addr.s_addr;
dst[0] = ip;
dst[1] = ip >> 8;
dst[2] = ip >> 16;
dst[3] = ip >> 24;
}
uint8_t get_host_address(iface_info *out)
{
#ifdef __ANDROID__
//TODO: write an implementation for Android
return 0;
#else
struct ifaddrs *entries, *current, *localhost;
if (getifaddrs(&entries)) {
return 0;
}
for (current = entries; current; current = current->ifa_next)
{
if (current->ifa_addr && current->ifa_addr->sa_family == AF_INET) {
struct sockaddr_in *addr = (struct sockaddr_in *)current->ifa_addr;
if (is_loopback(addr)) {
localhost = current;
} else {
break;
}
}
}
if (!current && localhost) {
current = localhost;
}
uint8_t ret = 0;
if (current) {
ret = 1;
format_address(out->ip, (struct sockaddr_in *)current->ifa_addr);
format_address(out->net_mask, (struct sockaddr_in *)current->ifa_netmask);
}
freeifaddrs(entries);
return ret;
#endif
}
|