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 }