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