MCPcopy Create free account
hub / github.com/defold/defold / GetIfAddresses

Function GetIfAddresses

engine/dlib/src/dlib/socket_win32.cpp:27–113  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

25namespace dmSocket
26{
27 void GetIfAddresses(IfAddr* addresses, uint32_t addresses_count, uint32_t* count)
28 {
29 *count = 0;
30 ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
31 ULONG family = AF_INET;
32
33 ULONG out_buf_len;
34 PIP_ADAPTER_ADDRESSES paddresses = NULL;
35
36 // Ask for the length first
37 DWORD ret = GetAdaptersAddresses(family, flags, NULL, NULL, &out_buf_len);
38
39 if (ret == ERROR_BUFFER_OVERFLOW)
40 { // the address pointer is null ofc
41 paddresses = (IP_ADAPTER_ADDRESSES*)malloc(out_buf_len);
42 ret = GetAdaptersAddresses(family, flags, NULL, paddresses, &out_buf_len);
43 }
44
45 PIP_ADAPTER_ADDRESSES pcurraddresses = NULL;
46 PIP_ADAPTER_UNICAST_ADDRESS punicast = NULL;
47
48 if (ret == NO_ERROR)
49 {
50 pcurraddresses = paddresses;
51 while (pcurraddresses && *count < addresses_count)
52 {
53 if (pcurraddresses->IfType != IF_TYPE_SOFTWARE_LOOPBACK)
54 {
55 punicast = pcurraddresses->FirstUnicastAddress;
56 if (punicast)
57 {
58 for (unsigned i = 0; punicast != NULL; i++)
59 {
60 IfAddr* a = &addresses[*count];
61 memset(a, 0, sizeof(*a));
62
63 wcstombs(a->m_Name, pcurraddresses->FriendlyName, sizeof(a->m_Name));
64 a->m_Name[sizeof(a->m_Name) - 1] = 0;
65
66 if (pcurraddresses->OperStatus == IfOperStatusUp)
67 {
68 a->m_Flags |= FLAGS_UP;
69 a->m_Flags |= FLAGS_RUNNING;
70 }
71
72 if (punicast->Address.lpSockaddr->sa_family == AF_INET)
73 {
74 a->m_Flags |= FLAGS_INET;
75 a->m_Address.m_family = DOMAIN_IPV4;
76 sockaddr_in* ia = (sockaddr_in*)punicast->Address.lpSockaddr;
77 *IPv4(&a->m_Address) = ia->sin_addr.s_addr;
78 }
79 else if (punicast->Address.lpSockaddr->sa_family == AF_INET6)
80 {
81 a->m_Flags |= FLAGS_INET;
82 a->m_Address.m_family = DOMAIN_IPV6;
83 sockaddr_in6* ia = (sockaddr_in6*)punicast->Address.lpSockaddr;
84 memcpy(IPv6(&a->m_Address), &ia->sin6_addr, sizeof(struct in6_addr));

Callers

nothing calls this directly

Calls 4

mallocFunction · 0.85
IPv4Function · 0.85
IPv6Function · 0.85
freeFunction · 0.85

Tested by

no test coverage detected