diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/libwebrtc/rtc_base/net_helpers.cc | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/rtc_base/net_helpers.cc')
-rw-r--r-- | third_party/libwebrtc/rtc_base/net_helpers.cc | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_base/net_helpers.cc b/third_party/libwebrtc/rtc_base/net_helpers.cc new file mode 100644 index 0000000000..73fe862313 --- /dev/null +++ b/third_party/libwebrtc/rtc_base/net_helpers.cc @@ -0,0 +1,130 @@ +/* + * Copyright 2008 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "rtc_base/net_helpers.h" + +#include <memory> +#include <string> + +#include "absl/strings/string_view.h" + +#if defined(WEBRTC_WIN) +#include <ws2spi.h> +#include <ws2tcpip.h> + +#include "rtc_base/win/windows_version.h" +#endif +#if defined(WEBRTC_POSIX) && !defined(__native_client__) +#include <arpa/inet.h> +#if defined(WEBRTC_ANDROID) +#include "rtc_base/ifaddrs_android.h" +#else +#include <ifaddrs.h> +#endif +#endif // defined(WEBRTC_POSIX) && !defined(__native_client__) + +namespace rtc { + +const char* inet_ntop(int af, const void* src, char* dst, socklen_t size) { +#if defined(WEBRTC_WIN) + return win32_inet_ntop(af, src, dst, size); +#else + return ::inet_ntop(af, src, dst, size); +#endif +} + +int inet_pton(int af, absl::string_view src, void* dst) { + std::string src_str(src); +#if defined(WEBRTC_WIN) + return win32_inet_pton(af, src_str.c_str(), dst); +#else + return ::inet_pton(af, src_str.c_str(), dst); +#endif +} + +bool HasIPv4Enabled() { +#if defined(WEBRTC_POSIX) && !defined(__native_client__) + bool has_ipv4 = false; + struct ifaddrs* ifa; + if (getifaddrs(&ifa) < 0) { + return false; + } + for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) { + if (cur->ifa_addr != nullptr && cur->ifa_addr->sa_family == AF_INET) { + has_ipv4 = true; + break; + } + } + freeifaddrs(ifa); + return has_ipv4; +#else + return true; +#endif +} + +bool HasIPv6Enabled() { +#if defined(WINUWP) + // WinUWP always has IPv6 capability. + return true; +#elif defined(WEBRTC_WIN) + if (rtc::rtc_win::GetVersion() >= rtc::rtc_win::Version::VERSION_VISTA) { + return true; + } + if (rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_XP) { + return false; + } + DWORD protbuff_size = 4096; + std::unique_ptr<char[]> protocols; + LPWSAPROTOCOL_INFOW protocol_infos = nullptr; + int requested_protocols[2] = {AF_INET6, 0}; + + int err = 0; + int ret = 0; + // Check for protocols in a do-while loop until we provide a buffer large + // enough. (WSCEnumProtocols sets protbuff_size to its desired value). + // It is extremely unlikely that this will loop more than once. + do { + protocols.reset(new char[protbuff_size]); + protocol_infos = reinterpret_cast<LPWSAPROTOCOL_INFOW>(protocols.get()); + ret = WSCEnumProtocols(requested_protocols, protocol_infos, &protbuff_size, + &err); + } while (ret == SOCKET_ERROR && err == WSAENOBUFS); + + if (ret == SOCKET_ERROR) { + return false; + } + + // Even if ret is positive, check specifically for IPv6. + // Non-IPv6 enabled WinXP will still return a RAW protocol. + for (int i = 0; i < ret; ++i) { + if (protocol_infos[i].iAddressFamily == AF_INET6) { + return true; + } + } + return false; +#elif defined(WEBRTC_POSIX) && !defined(__native_client__) + bool has_ipv6 = false; + struct ifaddrs* ifa; + if (getifaddrs(&ifa) < 0) { + return false; + } + for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) { + if (cur->ifa_addr != nullptr && cur->ifa_addr->sa_family == AF_INET6) { + has_ipv6 = true; + break; + } + } + freeifaddrs(ifa); + return has_ipv6; +#else + return true; +#endif +} +} // namespace rtc |