main net.c
 1#include <sys/types.h>
 2#include <ifaddrs.h>
 3#include <netinet/in.h>
 4#include "net.h"
 5
 6static uint8_t is_loopback(struct sockaddr_in *addr)
 7{
 8	return (addr->sin_addr.s_addr & 0xFF) == 127;
 9}
10
11static 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
20uint8_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}