1 //===-- HostInfoNetBSD.cpp ------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Host/netbsd/HostInfoNetBSD.h" 10 11 #include <cinttypes> 12 #include <climits> 13 #include <cstdio> 14 #include <cstring> 15 #include <optional> 16 #include <pthread.h> 17 #include <sys/sysctl.h> 18 #include <sys/types.h> 19 #include <sys/utsname.h> 20 #include <unistd.h> 21 22 using namespace lldb_private; 23 24 llvm::VersionTuple HostInfoNetBSD::GetOSVersion() { 25 struct utsname un; 26 27 ::memset(&un, 0, sizeof(un)); 28 if (::uname(&un) < 0) 29 return llvm::VersionTuple(); 30 31 /* Accept versions like 7.99.21 and 6.1_STABLE */ 32 uint32_t major, minor, update; 33 int status = ::sscanf(un.release, "%" PRIu32 ".%" PRIu32 ".%" PRIu32, &major, 34 &minor, &update); 35 switch (status) { 36 case 1: 37 return llvm::VersionTuple(major); 38 case 2: 39 return llvm::VersionTuple(major, minor); 40 case 3: 41 return llvm::VersionTuple(major, minor, update); 42 } 43 return llvm::VersionTuple(); 44 } 45 46 std::optional<std::string> HostInfoNetBSD::GetOSBuildString() { 47 int mib[2] = {CTL_KERN, KERN_OSREV}; 48 int osrev = 0; 49 size_t osrev_len = sizeof(osrev); 50 51 if (::sysctl(mib, 2, &osrev, &osrev_len, NULL, 0) == 0) 52 return llvm::formatv("{0,10:10}", osrev).str(); 53 54 return std::nullopt; 55 } 56 57 FileSpec HostInfoNetBSD::GetProgramFileSpec() { 58 static FileSpec g_program_filespec; 59 60 if (!g_program_filespec) { 61 static const int name[] = { 62 CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME, 63 }; 64 char path[MAXPATHLEN]; 65 size_t len; 66 67 len = sizeof(path); 68 if (sysctl(name, __arraycount(name), path, &len, NULL, 0) != -1) { 69 g_program_filespec.SetFile(path, FileSpec::Style::native); 70 } 71 } 72 return g_program_filespec; 73 } 74