1 //===-- HostInfoNetBSD.cpp -------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Host/netbsd/HostInfoNetBSD.h" 11 12 #include <limits.h> 13 #include <stdio.h> 14 #include <string.h> 15 #include <sys/types.h> 16 #include <sys/sysctl.h> 17 #include <sys/utsname.h> 18 #include <unistd.h> 19 #include <pthread.h> 20 #include <inttypes.h> 21 22 23 using namespace lldb_private; 24 25 uint32_t 26 HostInfoNetBSD::GetMaxThreadNameLength() 27 { 28 return PTHREAD_MAX_NAMELEN_NP; 29 } 30 31 bool 32 HostInfoNetBSD::GetOSVersion(uint32_t &major, uint32_t &minor, uint32_t &update) 33 { 34 struct utsname un; 35 36 ::memset(&un, 0, sizeof(un)); 37 if (::uname(&un) < 0) 38 return false; 39 40 /* Accept versions like 7.99.21 and 6.1_STABLE */ 41 int status = ::sscanf(un.release, "%" PRIu32 ".%" PRIu32 ".%" PRIu32, &major, &minor, &update); 42 switch(status) { 43 case 0: 44 return false; 45 case 1: 46 minor = 0; 47 /* FALLTHROUGH */ 48 case 2: 49 update = 0; 50 /* FALLTHROUGH */ 51 case 3: 52 default: 53 return true; 54 } 55 } 56 57 bool 58 HostInfoNetBSD::GetOSBuildString(std::string &s) 59 { 60 int mib[2] = {CTL_KERN, KERN_OSREV}; 61 char osrev_str[12]; 62 int osrev = 0; 63 size_t osrev_len = sizeof(osrev); 64 65 if (::sysctl(mib, 2, &osrev, &osrev_len, NULL, 0) == 0) 66 { 67 ::snprintf(osrev_str, sizeof(osrev_str), "%-10.10d", osrev); 68 s.assign(osrev_str); 69 return true; 70 } 71 72 s.clear(); 73 return false; 74 } 75 76 bool 77 HostInfoNetBSD::GetOSKernelDescription(std::string &s) 78 { 79 struct utsname un; 80 81 ::memset(&un, 0, sizeof(un)); 82 s.clear(); 83 84 if (::uname(&un) < 0) 85 return false; 86 87 s.assign(un.version); 88 89 return true; 90 } 91 92 FileSpec 93 HostInfoNetBSD::GetProgramFileSpec() 94 { 95 static FileSpec g_program_filespec; 96 97 if (!g_program_filespec) 98 { 99 ssize_t len; 100 static char buf[PATH_MAX]; 101 char name[PATH_MAX]; 102 103 ::snprintf(name, PATH_MAX, "/proc/%d/exe", ::getpid()); 104 len = ::readlink(name, buf, PATH_MAX - 1); 105 if (len != -1) 106 { 107 buf[len] = '\0'; 108 g_program_filespec.SetFile(buf, false); 109 } 110 } 111 return g_program_filespec; 112 } 113