diff --git a/cscore/src/main/native/cpp/cscore_cpp.cpp b/cscore/src/main/native/cpp/cscore_cpp.cpp index f5b6ab0511..d3791858c3 100644 --- a/cscore/src/main/native/cpp/cscore_cpp.cpp +++ b/cscore/src/main/native/cpp/cscore_cpp.cpp @@ -8,6 +8,7 @@ #include "cscore_cpp.h" #include +#include #include "Handle.h" #include "Log.h" @@ -686,4 +687,6 @@ wpi::ArrayRef EnumerateSinkHandles(wpi::SmallVectorImpl& vec, return Sinks::GetInstance().GetAll(vec); } +std::string GetHostname() { return wpi::GetHostname(); } + } // namespace cs diff --git a/cscore/src/main/native/linux/NetworkUtil.cpp b/cscore/src/main/native/linux/NetworkUtil.cpp index c8cde8cddd..2c1f3cd684 100644 --- a/cscore/src/main/native/linux/NetworkUtil.cpp +++ b/cscore/src/main/native/linux/NetworkUtil.cpp @@ -14,13 +14,6 @@ namespace cs { -std::string GetHostname() { - char name[256]; - if (::gethostname(name, sizeof(name)) != 0) return ""; - name[255] = '\0'; // Per POSIX, may not be null terminated if too long - return name; -} - std::vector GetNetworkInterfaces() { struct ifaddrs* ifa; if (::getifaddrs(&ifa) != 0) return std::vector{}; diff --git a/cscore/src/main/native/osx/NetworkUtil.cpp b/cscore/src/main/native/osx/NetworkUtil.cpp index 654b801a79..935c21f6db 100644 --- a/cscore/src/main/native/osx/NetworkUtil.cpp +++ b/cscore/src/main/native/osx/NetworkUtil.cpp @@ -9,10 +9,6 @@ namespace cs { -std::string GetHostname() { - return ""; // TODO -} - std::vector GetNetworkInterfaces() { return std::vector{}; // TODO } diff --git a/cscore/src/main/native/windows/NetworkUtil.cpp b/cscore/src/main/native/windows/NetworkUtil.cpp index 654b801a79..935c21f6db 100644 --- a/cscore/src/main/native/windows/NetworkUtil.cpp +++ b/cscore/src/main/native/windows/NetworkUtil.cpp @@ -9,10 +9,6 @@ namespace cs { -std::string GetHostname() { - return ""; // TODO -} - std::vector GetNetworkInterfaces() { return std::vector{}; // TODO } diff --git a/wpiutil/src/main/native/cpp/hostname.cpp b/wpiutil/src/main/native/cpp/hostname.cpp index e2c0990704..ffc5cad565 100644 --- a/wpiutil/src/main/native/cpp/hostname.cpp +++ b/wpiutil/src/main/native/cpp/hostname.cpp @@ -7,59 +7,50 @@ #include "wpi/hostname.h" -#ifdef _WIN32 -#include -#pragma comment(lib, "Ws2_32.lib") -#else -#include -#endif - +#include #include +#include "uv.h" #include "wpi/SmallVector.h" #include "wpi/StringRef.h" -#ifdef _WIN32 -struct WSAHelper { - WSAHelper() { - WSAData wsaData; - WORD wVersionRequested = MAKEWORD(2, 2); - WSAStartup(wVersionRequested, &wsaData); - } - ~WSAHelper() { WSACleanup(); } -}; -static WSAHelper& GetWSAHelper() { - static WSAHelper helper; - return helper; -} -#endif - namespace wpi { -static bool GetHostnameImpl(char* name, size_t name_len) { -#ifdef _WIN32 - GetWSAHelper(); -#endif - if (::gethostname(name, name_len) != 0) return false; - name[name_len - 1] = - '\0'; // Per POSIX, may not be null terminated if too long - return true; -} std::string GetHostname() { + std::string rv; char name[256]; - if (!GetHostnameImpl(name, sizeof(name))) return ""; - return name; + size_t size = sizeof(name); + + int err = uv_os_gethostname(name, &size); + if (err == 0) { + rv.assign(name, size); + } else if (err == UV_ENOBUFS) { + char* name2 = static_cast(std::malloc(size)); + err = uv_os_gethostname(name2, &size); + if (err == 0) rv.assign(name2, size); + std::free(name2); + } + + return rv; } StringRef GetHostname(SmallVectorImpl& name) { // Use a tmp array to not require the SmallVector to be too large. char tmpName[256]; - if (!GetHostnameImpl(tmpName, sizeof(tmpName))) { - return StringRef{}; - } - name.clear(); - name.append(tmpName, tmpName + std::strlen(tmpName) + 1); + size_t size = sizeof(tmpName); - return StringRef{name.data(), name.size()}; + name.clear(); + + int err = uv_os_gethostname(tmpName, &size); + if (err == 0) { + name.append(tmpName, tmpName + size); + } else if (err == UV_ENOBUFS) { + name.resize(size); + err = uv_os_gethostname(name.data(), &size); + if (err != 0) size = 0; + } + + return StringRef{name.data(), size}; } + } // namespace wpi diff --git a/wpiutil/src/test/native/cpp/hostname.cpp b/wpiutil/src/test/native/cpp/hostname.cpp index f1047a81be..d5ec5353e8 100644 --- a/wpiutil/src/test/native/cpp/hostname.cpp +++ b/wpiutil/src/test/native/cpp/hostname.cpp @@ -17,4 +17,8 @@ TEST(HostNameTest, HostNameNotEmptySmallVector) { SmallVector name; ASSERT_NE(GetHostname(name), ""); } +TEST(HostNameTest, HostNameEq) { + SmallVector nameBuf; + ASSERT_EQ(GetHostname(nameBuf), GetHostname()); +} } // namespace wpi