path_freebsd.odin 742 B

1234567891011121314151617181920212223242526272829
  1. package os2
  2. import "base:runtime"
  3. import "core:sys/freebsd"
  4. import "core:sys/posix"
  5. _get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) {
  6. req := []freebsd.MIB_Identifier{.CTL_KERN, .KERN_PROC, .KERN_PROC_PATHNAME, freebsd.MIB_Identifier(-1)}
  7. size: uint
  8. if ret := freebsd.sysctl(req, nil, &size, nil, 0); ret != .NONE {
  9. err = _get_platform_error(posix.Errno(ret))
  10. return
  11. }
  12. assert(size > 0)
  13. buf := make([]byte, size, allocator) or_return
  14. defer if err != nil { delete(buf, allocator) }
  15. assert(uint(len(buf)) == size)
  16. if ret := freebsd.sysctl(req, raw_data(buf), &size, nil, 0); ret != .NONE {
  17. err = _get_platform_error(posix.Errno(ret))
  18. return
  19. }
  20. return string(buf[:size-1]), nil
  21. }