blob: ffc5cad565c3452b922c8d00e3192c6e9395ef59 [file] [log] [blame]
Brian Silverman8fce7482020-01-05 13:18:21 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) 2017-2018 FIRST. All Rights Reserved. */
3/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#include "wpi/hostname.h"
9
10#include <cstdlib>
11#include <string>
12
13#include "uv.h"
14#include "wpi/SmallVector.h"
15#include "wpi/StringRef.h"
16
17namespace wpi {
18
19std::string GetHostname() {
20 std::string rv;
21 char name[256];
22 size_t size = sizeof(name);
23
24 int err = uv_os_gethostname(name, &size);
25 if (err == 0) {
26 rv.assign(name, size);
27 } else if (err == UV_ENOBUFS) {
28 char* name2 = static_cast<char*>(std::malloc(size));
29 err = uv_os_gethostname(name2, &size);
30 if (err == 0) rv.assign(name2, size);
31 std::free(name2);
32 }
33
34 return rv;
35}
36
37StringRef GetHostname(SmallVectorImpl<char>& name) {
38 // Use a tmp array to not require the SmallVector to be too large.
39 char tmpName[256];
40 size_t size = sizeof(tmpName);
41
42 name.clear();
43
44 int err = uv_os_gethostname(tmpName, &size);
45 if (err == 0) {
46 name.append(tmpName, tmpName + size);
47 } else if (err == UV_ENOBUFS) {
48 name.resize(size);
49 err = uv_os_gethostname(name.data(), &size);
50 if (err != 0) size = 0;
51 }
52
53 return StringRef{name.data(), size};
54}
55
56} // namespace wpi