30 IPAddress interfaceAddress, broadcastAddress;
33 inline bool operator== (
const InterfaceInfo& lhs,
const InterfaceInfo& rhs)
35 return lhs.interfaceAddress == rhs.interfaceAddress
36 && lhs.broadcastAddress == rhs.broadcastAddress;
40 static IPAddress makeAddress (
const sockaddr_in6* addr_in)
42 if (addr_in ==
nullptr)
45 auto addr = addr_in->sin6_addr;
47 IPAddressByteUnion temp;
50 for (
int i = 0;
i < 8; ++
i)
52 temp.split[0] = addr.s6_addr[
i * 2 + 1];
53 temp.split[1] = addr.s6_addr[
i * 2];
55 arr[
i] = temp.combined;
58 return IPAddress (arr);
61 static IPAddress makeAddress (
const sockaddr_in* addr_in)
63 if (addr_in->sin_addr.s_addr == INADDR_NONE)
66 return IPAddress (ntohl (addr_in->sin_addr.s_addr));
69 bool populateInterfaceInfo (
struct ifaddrs* ifa, InterfaceInfo& interfaceInfo)
71 if (ifa->ifa_addr !=
nullptr)
73 if (ifa->ifa_addr->sa_family == AF_INET)
75 auto interfaceAddressInfo = unalignedPointerCast<sockaddr_in*> (ifa->ifa_addr);
76 auto broadcastAddressInfo = unalignedPointerCast<sockaddr_in*> (ifa->ifa_dstaddr);
78 if (interfaceAddressInfo->sin_addr.s_addr != INADDR_NONE)
80 interfaceInfo.interfaceAddress = makeAddress (interfaceAddressInfo);
81 interfaceInfo.broadcastAddress = makeAddress (broadcastAddressInfo);
85 else if (ifa->ifa_addr->sa_family == AF_INET6)
87 interfaceInfo.interfaceAddress = makeAddress (unalignedPointerCast<sockaddr_in6*> (ifa->ifa_addr));
88 interfaceInfo.broadcastAddress = makeAddress (unalignedPointerCast<sockaddr_in6*> (ifa->ifa_dstaddr));
97 Array<InterfaceInfo> getAllInterfaceInfo()
99 Array<InterfaceInfo> interfaces;
104 struct ifaddrs* ifaddr =
nullptr;
106 if (getifaddrs (&ifaddr) != -1)
108 for (
auto* ifa = ifaddr; ifa !=
nullptr; ifa = ifa->ifa_next)
112 if (populateInterfaceInfo (ifa,
i))
116 freeifaddrs (ifaddr);
126 for (
auto&
i : getAllInterfaceInfo())
127 if (includeIPv6 || !
i.interfaceAddress.isIPv6)
128 result.addIfNotAlreadyThere (
i.interfaceAddress);
133 for (
auto&
i : getAllInterfaceInfo())
134 if (
i.interfaceAddress == interfaceAddress)
135 return i.broadcastAddress;
uint16_t uint16
Definition basics.h:88
bool addIfNotAlreadyThere(ParameterType newElement)
Definition Array.h:499
Definition juce_Array.h:56
static IPAddress getInterfaceBroadcastAddress(const IPAddress &interfaceAddress)
Definition juce_posix_IPAddress.h:131
static void findAllAddresses(Array< IPAddress > &results, bool includeIPv6=false)
Definition juce_posix_IPAddress.h:124
IPAddress() noexcept
Definition juce_IPAddress.cpp:39
register unsigned i
Definition inflate.c:1575
Definition carla_juce.cpp:31
int result
Definition process.c:1455