platform_bsd.odin 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #+build openbsd, netbsd
  2. package sysinfo
  3. import sys "core:sys/unix"
  4. import "core:strings"
  5. import "core:strconv"
  6. import "base:runtime"
  7. @(private)
  8. version_string_buf: [1024]u8
  9. @(init, private)
  10. init_os_version :: proc "contextless" () {
  11. context = runtime.default_context()
  12. when ODIN_OS == .NetBSD {
  13. os_version.platform = .NetBSD
  14. } else {
  15. os_version.platform = .OpenBSD
  16. }
  17. kernel_version_buf: [1024]u8
  18. b := strings.builder_from_bytes(version_string_buf[:])
  19. // Retrieve kernel info using `sysctl`, e.g. OpenBSD and NetBSD
  20. mib := []i32{sys.CTL_KERN, sys.KERN_OSTYPE}
  21. if !sys.sysctl(mib, &kernel_version_buf) {
  22. return
  23. }
  24. os_type := string(cstring(raw_data(kernel_version_buf[:])))
  25. strings.write_string(&b, os_type)
  26. mib = []i32{sys.CTL_KERN, sys.KERN_OSRELEASE}
  27. if !sys.sysctl(mib, &kernel_version_buf) {
  28. return
  29. }
  30. strings.write_rune(&b, ' ')
  31. version := string(cstring(raw_data(kernel_version_buf[:])))
  32. strings.write_string(&b, version)
  33. runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD()
  34. // Parse kernel version
  35. triplet := strings.split(version, ".", context.temp_allocator)
  36. if len(triplet) == 2 {
  37. major, major_ok := strconv.parse_int(triplet[0])
  38. minor, minor_ok := strconv.parse_int(triplet[1])
  39. if major_ok && minor_ok {
  40. os_version.major = major
  41. os_version.minor = minor
  42. }
  43. }
  44. // Retrieve kernel revision using `sysctl`, e.g. 199506
  45. mib = []i32{sys.CTL_KERN, sys.KERN_OSREV}
  46. revision: int
  47. if !sys.sysctl(mib, &revision) {
  48. return
  49. }
  50. os_version.patch = revision
  51. strings.write_string(&b, ", build ")
  52. strings.write_int(&b, revision)
  53. // Finalize pretty name.
  54. os_version.as_string = strings.to_string(b)
  55. }
  56. @(init, private)
  57. init_ram :: proc "contextless" () {
  58. // Retrieve RAM info using `sysctl`
  59. mib := []i32{sys.CTL_HW, sys.HW_PHYSMEM64}
  60. mem_size: u64
  61. if sys.sysctl(mib, &mem_size) {
  62. ram.total_ram = int(mem_size)
  63. }
  64. }