mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-26 01:51:41 +00:00
Adds wpi GetHostname function (#25)
This commit is contained in:
committed by
Peter Johnson
parent
5d403a7b49
commit
c3f7c85f8a
@@ -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;
|
||||
|
||||
64
src/main/native/cpp/support/hostname.cpp
Normal file
64
src/main/native/cpp/support/hostname.cpp
Normal 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
|
||||
24
src/main/native/include/support/hostname.h
Normal file
24
src/main/native/include/support/hostname.h
Normal 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_
|
||||
22
src/test/native/cpp/hostname.cpp
Normal file
22
src/test/native/cpp/hostname.cpp
Normal 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
|
||||
Reference in New Issue
Block a user