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