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

Function GetIfAddresses

engine/dlib/src/dlib/socket_linux.cpp:29–109  ·  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 dmLogError("Unable to create socket for GetIfAddresses");
39 return;
40 }
41
42 memset(&ifc, 0, sizeof(ifc));
43 ifr = (ifreq*) buf;
44 ifc.ifc_ifcu.ifcu_req = ifr;
45 ifc.ifc_len = sizeof(buf);
46 if (ioctl(s, SIOCGIFCONF, &ifc) < 0) {
47 close(s);
48 return;
49 }
50
51 // NOTE: This is not compatible with BSD. You can't assume
52 // equivalent size for all items
53 int numif = ifc.ifc_len / sizeof(struct ifreq);
54 for (int i = 0; i < numif && *count < addresses_count; i++) {
55 struct ifreq *r = &ifr[i];
56
57 if (strcmp(r->ifr_name, "lo") == 0) {
58 continue;
59 }
60
61 IfAddr* a = &addresses[*count];
62 memset(a, 0, sizeof(*a));
63
64 dmStrlCpy(a->m_Name, r->ifr_name, sizeof(a->m_Name));
65
66 if(ioctl(s, SIOCGIFADDR, r) < 0)
67 continue;
68
69 if (r->ifr_addr.sa_family == AF_INET)
70 {
71 sockaddr_in* ia = (sockaddr_in*) &r->ifr_ifru.ifru_addr;
72 a->m_Flags |= FLAGS_INET;
73 a->m_Address.m_family = DOMAIN_IPV4;
74 *IPv4(&a->m_Address) = ia->sin_addr.s_addr;
75 }
76 else if (r->ifr_addr.sa_family == AF_INET6)
77 {
78 sockaddr_in6* ia = (sockaddr_in6*) &r->ifr_ifru.ifru_addr;
79 a->m_Flags |= FLAGS_INET;
80 a->m_Address.m_family = DOMAIN_IPV6;
81 memcpy(IPv6(&a->m_Address), &ia->sin6_addr, sizeof(struct in6_addr));
82 }
83
84 if(ioctl(s, SIOCGIFHWADDR, r) >= 0)
85 {
86 memcpy(a->m_MacAddress, &r->ifr_hwaddr.sa_data[0], sizeof(unsigned char) * 6);

Callers

nothing calls this directly

Calls 3

dmStrlCpyFunction · 0.85
IPv4Function · 0.85
IPv6Function · 0.85

Tested by

no test coverage detected