Adds wpi GetHostname function (#25)

This commit is contained in:
Thad House
2017-08-27 21:35:34 -07:00
committed by Peter Johnson
parent 5d403a7b49
commit c3f7c85f8a
4 changed files with 113 additions and 0 deletions

View File

@@ -1,6 +1,9 @@
#include "llvm/StringRef.h"
#include "llvm/SmallVector.h"
#include <iostream>
#include "support/hostname.h"
int main() {
llvm::StringRef v1("Hello");
std::cout << v1.lower() << std::endl;

View File

@@ -0,0 +1,64 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2017. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "support/hostname.h"
#ifdef _WIN32
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
#else
#include <unistd.h>
#endif
#include <string>
#include "llvm/SmallVector.h"
#include "llvm/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() {
char name[256];
if (!GetHostnameImpl(name, sizeof(name))) return "";
return name;
}
llvm::StringRef GetHostname(llvm::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 llvm::StringRef{};
}
name.clear();
name.append(tmpName, tmpName + std::strlen(tmpName) + 1);
return llvm::StringRef{name.data(), name.size(), true};
}
} // namespace wpi

View File

@@ -0,0 +1,24 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2017. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#ifndef HOSTNAME_H_
#define HOSTNAME_H_
#include <string>
#include "llvm/StringRef.h"
namespace llvm {
template <typename T>
class SmallVectorImpl;
}
namespace wpi {
std::string GetHostname();
llvm::StringRef GetHostname(llvm::SmallVectorImpl<char>& name);
} // namespace wpi
#endif // HOSTNAME_H_

View File

@@ -0,0 +1,22 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2017. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "support/hostname.h"
#include "llvm/SmallString.h"
#include "llvm/SmallVector.h"
#include "gtest/gtest.h"
namespace wpi {
TEST(HostNameTest, HostNameNotEmpty) {
ASSERT_NE(wpi::GetHostname(), "");
}
TEST(HostNameTest, HostNameNotEmptySmallVector) {
llvm::SmallVector<char, 256> name;
ASSERT_NE(wpi::GetHostname(name), "");
}
} // namespace wpi