xref: /freebsd-src/contrib/llvm-project/lldb/source/Host/netbsd/HostInfoNetBSD.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
15ffd83dbSDimitry Andric //===-- HostInfoNetBSD.cpp ------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/Host/netbsd/HostInfoNetBSD.h"
100b57cec5SDimitry Andric 
11fe6060f1SDimitry Andric #include <cinttypes>
12fe6060f1SDimitry Andric #include <climits>
13fe6060f1SDimitry Andric #include <cstdio>
14fe6060f1SDimitry Andric #include <cstring>
15*bdd1243dSDimitry Andric #include <optional>
160b57cec5SDimitry Andric #include <pthread.h>
170b57cec5SDimitry Andric #include <sys/sysctl.h>
180b57cec5SDimitry Andric #include <sys/types.h>
190b57cec5SDimitry Andric #include <sys/utsname.h>
200b57cec5SDimitry Andric #include <unistd.h>
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric using namespace lldb_private;
230b57cec5SDimitry Andric 
GetOSVersion()240b57cec5SDimitry Andric llvm::VersionTuple HostInfoNetBSD::GetOSVersion() {
250b57cec5SDimitry Andric   struct utsname un;
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric   ::memset(&un, 0, sizeof(un));
280b57cec5SDimitry Andric   if (::uname(&un) < 0)
290b57cec5SDimitry Andric     return llvm::VersionTuple();
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric   /* Accept versions like 7.99.21 and 6.1_STABLE */
320b57cec5SDimitry Andric   uint32_t major, minor, update;
330b57cec5SDimitry Andric   int status = ::sscanf(un.release, "%" PRIu32 ".%" PRIu32 ".%" PRIu32, &major,
340b57cec5SDimitry Andric                         &minor, &update);
350b57cec5SDimitry Andric   switch (status) {
360b57cec5SDimitry Andric   case 1:
370b57cec5SDimitry Andric     return llvm::VersionTuple(major);
380b57cec5SDimitry Andric   case 2:
390b57cec5SDimitry Andric     return llvm::VersionTuple(major, minor);
400b57cec5SDimitry Andric   case 3:
410b57cec5SDimitry Andric     return llvm::VersionTuple(major, minor, update);
420b57cec5SDimitry Andric   }
430b57cec5SDimitry Andric   return llvm::VersionTuple();
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
GetOSBuildString()46*bdd1243dSDimitry Andric std::optional<std::string> HostInfoNetBSD::GetOSBuildString() {
470b57cec5SDimitry Andric   int mib[2] = {CTL_KERN, KERN_OSREV};
480b57cec5SDimitry Andric   int osrev = 0;
490b57cec5SDimitry Andric   size_t osrev_len = sizeof(osrev);
500b57cec5SDimitry Andric 
51349cc55cSDimitry Andric   if (::sysctl(mib, 2, &osrev, &osrev_len, NULL, 0) == 0)
52349cc55cSDimitry Andric     return llvm::formatv("{0,10:10}", osrev).str();
530b57cec5SDimitry Andric 
54*bdd1243dSDimitry Andric   return std::nullopt;
550b57cec5SDimitry Andric }
560b57cec5SDimitry Andric 
GetProgramFileSpec()570b57cec5SDimitry Andric FileSpec HostInfoNetBSD::GetProgramFileSpec() {
580b57cec5SDimitry Andric   static FileSpec g_program_filespec;
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   if (!g_program_filespec) {
610b57cec5SDimitry Andric     static const int name[] = {
620b57cec5SDimitry Andric         CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME,
630b57cec5SDimitry Andric     };
640b57cec5SDimitry Andric     char path[MAXPATHLEN];
650b57cec5SDimitry Andric     size_t len;
660b57cec5SDimitry Andric 
670b57cec5SDimitry Andric     len = sizeof(path);
680b57cec5SDimitry Andric     if (sysctl(name, __arraycount(name), path, &len, NULL, 0) != -1) {
690b57cec5SDimitry Andric       g_program_filespec.SetFile(path, FileSpec::Style::native);
700b57cec5SDimitry Andric     }
710b57cec5SDimitry Andric   }
720b57cec5SDimitry Andric   return g_program_filespec;
730b57cec5SDimitry Andric }
74