Unify GetHostname() and use libuv implementation (#1391)

This commit is contained in:
Peter Johnson
2018-10-28 19:01:48 -07:00
committed by GitHub
parent a8aacd3657
commit 9a1af132bf
6 changed files with 37 additions and 54 deletions

View File

@@ -8,6 +8,7 @@
#include "cscore_cpp.h"
#include <wpi/SmallString.h>
#include <wpi/hostname.h>
#include "Handle.h"
#include "Log.h"
@@ -686,4 +687,6 @@ wpi::ArrayRef<CS_Sink> EnumerateSinkHandles(wpi::SmallVectorImpl<CS_Sink>& vec,
return Sinks::GetInstance().GetAll(vec);
}
std::string GetHostname() { return wpi::GetHostname(); }
} // namespace cs

View File

@@ -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<std::string> GetNetworkInterfaces() {
struct ifaddrs* ifa;
if (::getifaddrs(&ifa) != 0) return std::vector<std::string>{};

View File

@@ -9,10 +9,6 @@
namespace cs {
std::string GetHostname() {
return ""; // TODO
}
std::vector<std::string> GetNetworkInterfaces() {
return std::vector<std::string>{}; // TODO
}

View File

@@ -9,10 +9,6 @@
namespace cs {
std::string GetHostname() {
return ""; // TODO
}
std::vector<std::string> GetNetworkInterfaces() {
return std::vector<std::string>{}; // TODO
}

View File

@@ -7,59 +7,50 @@
#include "wpi/hostname.h"
#ifdef _WIN32
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
#else
#include <unistd.h>
#endif
#include <cstdlib>
#include <string>
#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<char*>(std::malloc(size));
err = uv_os_gethostname(name2, &size);
if (err == 0) rv.assign(name2, size);
std::free(name2);
}
return rv;
}
StringRef GetHostname(SmallVectorImpl<char>& 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

View File

@@ -17,4 +17,8 @@ TEST(HostNameTest, HostNameNotEmptySmallVector) {
SmallVector<char, 256> name;
ASSERT_NE(GetHostname(name), "");
}
TEST(HostNameTest, HostNameEq) {
SmallVector<char, 256> nameBuf;
ASSERT_EQ(GetHostname(nameBuf), GetHostname());
}
} // namespace wpi