xref: /openbsd-src/gnu/llvm/lldb/source/Host/netbsd/HostInfoNetBSD.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- HostInfoNetBSD.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/netbsd/HostInfoNetBSD.h"
10061da546Spatrick 
11be691f3bSpatrick #include <cinttypes>
12be691f3bSpatrick #include <climits>
13be691f3bSpatrick #include <cstdio>
14be691f3bSpatrick #include <cstring>
15*f6aab3d8Srobert #include <optional>
16061da546Spatrick #include <pthread.h>
17061da546Spatrick #include <sys/sysctl.h>
18061da546Spatrick #include <sys/types.h>
19061da546Spatrick #include <sys/utsname.h>
20061da546Spatrick #include <unistd.h>
21061da546Spatrick 
22061da546Spatrick using namespace lldb_private;
23061da546Spatrick 
GetOSVersion()24061da546Spatrick llvm::VersionTuple HostInfoNetBSD::GetOSVersion() {
25061da546Spatrick   struct utsname un;
26061da546Spatrick 
27061da546Spatrick   ::memset(&un, 0, sizeof(un));
28061da546Spatrick   if (::uname(&un) < 0)
29061da546Spatrick     return llvm::VersionTuple();
30061da546Spatrick 
31061da546Spatrick   /* Accept versions like 7.99.21 and 6.1_STABLE */
32061da546Spatrick   uint32_t major, minor, update;
33061da546Spatrick   int status = ::sscanf(un.release, "%" PRIu32 ".%" PRIu32 ".%" PRIu32, &major,
34061da546Spatrick                         &minor, &update);
35061da546Spatrick   switch (status) {
36061da546Spatrick   case 1:
37061da546Spatrick     return llvm::VersionTuple(major);
38061da546Spatrick   case 2:
39061da546Spatrick     return llvm::VersionTuple(major, minor);
40061da546Spatrick   case 3:
41061da546Spatrick     return llvm::VersionTuple(major, minor, update);
42061da546Spatrick   }
43061da546Spatrick   return llvm::VersionTuple();
44061da546Spatrick }
45061da546Spatrick 
GetOSBuildString()46*f6aab3d8Srobert std::optional<std::string> HostInfoNetBSD::GetOSBuildString() {
47061da546Spatrick   int mib[2] = {CTL_KERN, KERN_OSREV};
48061da546Spatrick   char osrev_str[12];
49061da546Spatrick   int osrev = 0;
50061da546Spatrick   size_t osrev_len = sizeof(osrev);
51061da546Spatrick 
52*f6aab3d8Srobert   if (::sysctl(mib, 2, &osrev, &osrev_len, NULL, 0) == 0)
53*f6aab3d8Srobert     return llvm::formatv("{0,10:10}", osrev).str();
54061da546Spatrick 
55*f6aab3d8Srobert   return std::nullopt;
56061da546Spatrick }
57061da546Spatrick 
GetProgramFileSpec()58061da546Spatrick FileSpec HostInfoNetBSD::GetProgramFileSpec() {
59061da546Spatrick   static FileSpec g_program_filespec;
60061da546Spatrick 
61061da546Spatrick   if (!g_program_filespec) {
62061da546Spatrick     static const int name[] = {
63061da546Spatrick         CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME,
64061da546Spatrick     };
65061da546Spatrick     char path[MAXPATHLEN];
66061da546Spatrick     size_t len;
67061da546Spatrick 
68061da546Spatrick     len = sizeof(path);
69061da546Spatrick     if (sysctl(name, __arraycount(name), path, &len, NULL, 0) != -1) {
70061da546Spatrick       g_program_filespec.SetFile(path, FileSpec::Style::native);
71061da546Spatrick     }
72061da546Spatrick   }
73061da546Spatrick   return g_program_filespec;
74061da546Spatrick }
75