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

Function GetIfAddresses

engine/dlib/src/dlib/socket_android.cpp:29–116  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

27namespace dmSocket
28{
29 void GetIfAddresses(IfAddr* addresses, uint32_t addresses_count, uint32_t* count)
30 {
31 *count = 0;
32
33 struct ifreq* ifr;
34 struct ifconf ifc;
35 char buf[2048];
36 int s = socket(AF_INET, SOCK_DGRAM, 0);
37 if (s < 0)
38 {
39 dmLogError("Unable to create socket for GetIfAddresses");
40 return;
41 }
42
43 memset(&ifc, 0, sizeof(ifc));
44 ifr = (ifreq*) buf;
45 ifc.ifc_ifcu.ifcu_req = ifr;
46 ifc.ifc_len = sizeof(buf);
47 if (ioctl(s, SIOCGIFCONF, &ifc) < 0)
48 {
49 close(s);
50 return;
51 }
52
53 int numif = ifc.ifc_len / sizeof(struct ifreq);
54 for (int i = 0; i < numif && *count < addresses_count; i++)
55 {
56 struct ifreq* r = &ifr[i];
57
58 if (strcmp(r->ifr_name, "lo") == 0)
59 {
60 continue;
61 }
62
63 IfAddr* a = &addresses[*count];
64 memset(a, 0, sizeof(*a));
65
66 dmStrlCpy(a->m_Name, r->ifr_name, sizeof(a->m_Name));
67
68 if (ioctl(s, SIOCGIFADDR, r) < 0)
69 {
70 continue;
71 }
72
73 if (r->ifr_addr.sa_family == AF_INET)
74 {
75 sockaddr_in* ia = (sockaddr_in*) &r->ifr_ifru.ifru_addr;
76 a->m_Flags |= FLAGS_INET;
77 a->m_Address.m_family = DOMAIN_IPV4;
78 *IPv4(&a->m_Address) = ia->sin_addr.s_addr;
79 }
80 else if (r->ifr_addr.sa_family == AF_INET6)
81 {
82 sockaddr_in6* ia = (sockaddr_in6*) &r->ifr_ifru.ifru_addr;
83 a->m_Flags |= FLAGS_INET;
84 a->m_Address.m_family = DOMAIN_IPV6;
85 memcpy(IPv6(&a->m_Address), &ia->sin6_addr, sizeof(struct in6_addr));
86 }

Callers

nothing calls this directly

Calls 3

dmStrlCpyFunction · 0.85
IPv4Function · 0.85
IPv6Function · 0.85

Tested by

no test coverage detected