Mercurial > repos > blastem
comparison net.c @ 1514:4f94e0f90c83
Added support for MegaWiFi command IP_CURRENT
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 16 Jan 2018 09:31:00 -0800 |
parents | |
children | 78abbabfd58d |
comparison
equal
deleted
inserted
replaced
1513:8f3b6a64b658 | 1514:4f94e0f90c83 |
---|---|
1 #include <sys/types.h> | |
2 #include <ifaddrs.h> | |
3 #include <netinet/in.h> | |
4 #include "net.h" | |
5 | |
6 static uint8_t is_loopback(struct sockaddr_in *addr) | |
7 { | |
8 return (addr->sin_addr.s_addr & 0xFF) == 127; | |
9 } | |
10 | |
11 static void format_address(uint8_t *dst, struct sockaddr_in *addr) | |
12 { | |
13 long ip = addr->sin_addr.s_addr; | |
14 dst[0] = ip; | |
15 dst[1] = ip >> 8; | |
16 dst[2] = ip >> 16; | |
17 dst[3] = ip >> 24; | |
18 } | |
19 | |
20 uint8_t get_host_address(iface_info *out) | |
21 { | |
22 struct ifaddrs *entries, *current, *localhost; | |
23 if (getifaddrs(&entries)) { | |
24 return 0; | |
25 } | |
26 | |
27 for (current = entries; current; current = current->ifa_next) | |
28 { | |
29 if (current->ifa_addr && current->ifa_addr->sa_family == AF_INET) { | |
30 struct sockaddr_in *addr = (struct sockaddr_in *)current->ifa_addr; | |
31 if (is_loopback(addr)) { | |
32 localhost = current; | |
33 } else { | |
34 break; | |
35 } | |
36 } | |
37 } | |
38 if (!current && localhost) { | |
39 current = localhost; | |
40 } | |
41 uint8_t ret = 0; | |
42 if (current) { | |
43 ret = 1; | |
44 format_address(out->ip, (struct sockaddr_in *)current->ifa_addr); | |
45 format_address(out->net_mask, (struct sockaddr_in *)current->ifa_netmask); | |
46 } | |
47 freeifaddrs(entries); | |
48 return ret; | |
49 } |