xref: /openbsd-src/gnu/llvm/lldb/source/Host/openbsd/HostInfoOpenBSD.cpp (revision 101d251d5caf88a9341f3045ab62e122abae1b90)
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