aboutsummaryrefslogtreecommitdiff
path: root/core/os/path_freebsd.odin
blob: 5ec43466e07f6f0f5394ab5a391529b173f45af7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package os

import "base:runtime"

import "core:sys/freebsd"
import "core:sys/posix"

_get_executable_path :: proc(allocator: runtime.Allocator) -> (path: string, err: Error) {
	req := []freebsd.MIB_Identifier{.CTL_KERN, .KERN_PROC, .KERN_PROC_PATHNAME, freebsd.MIB_Identifier(-1)}

	size: uint
	if ret := freebsd.sysctl(req, nil, &size, nil, 0); ret != .NONE {
		err = _get_platform_error(posix.Errno(ret))
		return
	}
	assert(size > 0)

	buf := make([]byte, size, allocator) or_return
	defer if err != nil { delete(buf, allocator) }

	assert(uint(len(buf)) == size)

	if ret := freebsd.sysctl(req, raw_data(buf), &size, nil, 0); ret != .NONE {
		err = _get_platform_error(posix.Errno(ret))
		return
	}

	return string(buf[:size-1]), nil
}