1 #define _WIN32_WINNT 0x0501
2 
3 #include <stdio.h>
4 
5 #include <winsock2.h>
6 #include <ws2tcpip.h>
7 #include <iptypes.h>
8 #include <iphlpapi.h>
9 
10 #include "network.h"
11 #include "common.h"
12 
13 
get_adapters_addresses(IP_ADAPTER_ADDRESSES * adapters,ULONG * size)14 int get_adapters_addresses(IP_ADAPTER_ADDRESSES *adapters, ULONG *size)
15 {
16     return GetAdaptersAddresses(AF_UNSPEC, 0, 0, adapters, size);
17 }
18 
c_get_network_interfaces(struct network_interface * ns,int max_ns)19 int c_get_network_interfaces(struct network_interface *ns, int max_ns)
20 {
21     struct sockaddr *addr;
22     IP_ADAPTER_ADDRESSES *adapters, *adapter;
23     IP_ADAPTER_UNICAST_ADDRESS *unicast;
24     ULONG buffer_size;
25     DWORD error;
26     int family, i;
27 
28     /* make an initial call to get the necessary
29      * size into the buffer_size variable */
30     error = get_adapters_addresses(NULL, &buffer_size);
31 
32     if (error != ERROR_BUFFER_OVERFLOW) {
33         /* if we didn't get ERROR_BUFFER_OVERFLOW
34          * then buffer_size was not set */
35         return 0;
36     }
37 
38     adapters = malloc(buffer_size);
39     error = get_adapters_addresses(adapters, &buffer_size);
40     i = 0;
41 
42     if (error == NO_ERROR) {
43         adapter = adapters;
44 
45         while (i < max_ns && adapter) {
46             wszcopy(ns[i].name, adapter->FriendlyName, NAME_SIZE);
47             memcpy(ns[i].mac_address, adapter->PhysicalAddress, MAC_SIZE);
48 
49             for (unicast = adapter->FirstUnicastAddress; unicast; unicast = unicast->Next) {
50                 addr = unicast->Address.lpSockaddr;
51                 family = addr->sa_family;
52 
53                 if (family == AF_INET) {
54                     ipv4copy(&ns[i].ip_address, addr);
55                 } else if (family == AF_INET6) {
56                     ipv6copy(&ns[i].ip6_address, addr);
57                 }
58             }
59 
60             i++;
61             adapter = adapter->Next;
62         }
63     }
64 
65     free(adapters);
66     return i;
67 }
68 
69 #include "common.inc"
70