blob: ae25b29bc8f42ea1c2bbe845acc69ea7edaca35f [file] [log] [blame]
James Kuszmaulcf324122023-01-14 14:07:17 -08001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#include "wpinet/hostname.h"
6
7#include <cstdlib>
8#include <string>
9#include <string_view>
10
11#include <wpi/SmallVector.h>
12
13#include "uv.h"
14
15namespace wpi {
16
17std::string GetHostname() {
18 std::string rv;
19 char name[256];
20 size_t size = sizeof(name);
21
22 int err = uv_os_gethostname(name, &size);
23 if (err == 0) {
24 rv.assign(name, size);
25 } else if (err == UV_ENOBUFS) {
26 char* name2 = static_cast<char*>(std::malloc(size));
27 err = uv_os_gethostname(name2, &size);
28 if (err == 0) {
29 rv.assign(name2, size);
30 }
31 std::free(name2);
32 }
33
34 return rv;
35}
36
37std::string_view 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) {
51 size = 0;
52 }
53 }
54
55 return {name.data(), size};
56}
57
58} // namespace wpi