1dda28197Spatrick //===-- HostInfoOpenBSD.cpp -----------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/Host/openbsd/HostInfoOpenBSD.h"
10adae0cfdSpatrick #include "lldb/Host/FileSystem.h"
11061da546Spatrick
12a0747c9fSpatrick #include <cstdio>
13a0747c9fSpatrick #include <cstring>
14adae0cfdSpatrick #include <unistd.h>
15*101d251dSrobert #include <optional>
16061da546Spatrick #include <sys/sysctl.h>
17061da546Spatrick #include <sys/types.h>
18061da546Spatrick #include <sys/utsname.h>
19061da546Spatrick
20061da546Spatrick using namespace lldb_private;
21061da546Spatrick
GetOSVersion()22061da546Spatrick llvm::VersionTuple HostInfoOpenBSD::GetOSVersion() {
23061da546Spatrick struct utsname un;
24061da546Spatrick
25adae0cfdSpatrick ::memset(&un, 0, sizeof(un));
26adae0cfdSpatrick if (::uname(&un) < 0)
27061da546Spatrick return llvm::VersionTuple();
28061da546Spatrick
29adae0cfdSpatrick uint32_t major, minor;
30adae0cfdSpatrick int status = ::sscanf(un.release, "%" PRIu32 ".%" PRIu32, &major, &minor);
31adae0cfdSpatrick switch (status) {
32adae0cfdSpatrick case 1:
33adae0cfdSpatrick return llvm::VersionTuple(major);
34adae0cfdSpatrick case 2:
35061da546Spatrick return llvm::VersionTuple(major, minor);
36adae0cfdSpatrick }
37061da546Spatrick return llvm::VersionTuple();
38061da546Spatrick }
39061da546Spatrick
GetOSBuildString()40*101d251dSrobert std::optional<std::string> HostInfoOpenBSD::GetOSBuildString() {
41061da546Spatrick int mib[2] = {CTL_KERN, KERN_OSREV};
42061da546Spatrick uint32_t osrev = 0;
43061da546Spatrick size_t osrev_len = sizeof(osrev);
44061da546Spatrick
45*101d251dSrobert if (::sysctl(mib, 2, &osrev, &osrev_len, NULL, 0) == 0)
46*101d251dSrobert return llvm::formatv("{0,8:8}", osrev).str();
47061da546Spatrick
48*101d251dSrobert return std::nullopt;
49061da546Spatrick }
50061da546Spatrick
GetProgramFileSpec()51061da546Spatrick FileSpec HostInfoOpenBSD::GetProgramFileSpec() {
52061da546Spatrick static FileSpec g_program_filespec;
53061da546Spatrick return g_program_filespec;
54061da546Spatrick }
55adae0cfdSpatrick
ComputeSupportExeDirectory(FileSpec & file_spec)56adae0cfdSpatrick bool HostInfoOpenBSD::ComputeSupportExeDirectory(FileSpec &file_spec) {
57adae0cfdSpatrick if (HostInfoPosix::ComputeSupportExeDirectory(file_spec) &&
58adae0cfdSpatrick file_spec.IsAbsolute() && FileSystem::Instance().Exists(file_spec))
59adae0cfdSpatrick return true;
60adae0cfdSpatrick
61*101d251dSrobert file_spec.SetDirectory("/usr/bin");
62adae0cfdSpatrick return true;
63adae0cfdSpatrick }
64