platform_bsd.odin 1.8 KB

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