platform_freebsd.odin 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // +build freebsd
  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. os_version.platform = .FreeBSD
  12. kernel_version_buf: [129]u8
  13. b := strings.builder_from_bytes(version_string_buf[:])
  14. // Retrieve kernel info using `sysctl`, e.g. FreeBSD 13.1-RELEASE-p2 GENERIC
  15. mib := []i32{sys.CTL_KERN, sys.KERN_VERSION}
  16. if !sys.sysctl(mib, &kernel_version_buf) {
  17. return
  18. }
  19. pretty_name := string(cstring(raw_data(kernel_version_buf[:])))
  20. pretty_name = strings.trim(pretty_name, "\n")
  21. strings.write_string(&b, pretty_name)
  22. // l := strings.builder_len(b)
  23. // Retrieve kernel revision using `sysctl`, e.g. 199506
  24. mib = []i32{sys.CTL_KERN, sys.KERN_OSREV}
  25. revision: int
  26. if !sys.sysctl(mib, &revision) {
  27. return
  28. }
  29. os_version.patch = revision
  30. strings.write_string(&b, ", revision ")
  31. strings.write_int(&b, revision)
  32. // Finalize pretty name.
  33. os_version.as_string = strings.to_string(b)
  34. // Retrieve kernel release using `sysctl`, e.g. 13.1-RELEASE-p2
  35. mib = []i32{sys.CTL_KERN, sys.KERN_OSRELEASE}
  36. if !sys.sysctl(mib, &kernel_version_buf) {
  37. return
  38. }
  39. runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD()
  40. // Parse kernel version
  41. release := string(cstring(raw_data(kernel_version_buf[:])))
  42. version_bits := strings.split_n(release, "-", 2, context.temp_allocator)
  43. if len(version_bits) > 1 {
  44. // Parse major, minor from KERN_OSRELEASE
  45. triplet := strings.split(version_bits[0], ".", context.temp_allocator)
  46. if len(triplet) == 2 {
  47. major, major_ok := strconv.parse_int(triplet[0])
  48. minor, minor_ok := strconv.parse_int(triplet[1])
  49. if major_ok && minor_ok {
  50. os_version.major = major
  51. os_version.minor = minor
  52. }
  53. }
  54. }
  55. }
  56. @(init)
  57. init_ram :: proc() {
  58. // Retrieve RAM info using `sysctl`
  59. mib := []i32{sys.CTL_HW, sys.HW_PHYSMEM}
  60. mem_size: u64
  61. if sys.sysctl(mib, &mem_size) {
  62. ram.total_ram = int(mem_size)
  63. }
  64. }