1// Copyright 2016 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5//go:build freebsd || dragonfly 6 7package os 8 9import ( 10 "syscall" 11 "unsafe" 12) 13 14func executable() (string, error) { 15 mib := [4]int32{_CTL_KERN, _KERN_PROC, _KERN_PROC_PATHNAME, -1} 16 17 n := uintptr(0) 18 // get length 19 _, _, err := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, 0, uintptr(unsafe.Pointer(&n)), 0, 0) 20 if err != 0 { 21 return "", err 22 } 23 if n == 0 { // shouldn't happen 24 return "", nil 25 } 26 buf := make([]byte, n) 27 _, _, err = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, uintptr(unsafe.Pointer(&buf[0])), uintptr(unsafe.Pointer(&n)), 0, 0) 28 if err != 0 { 29 return "", err 30 } 31 if n == 0 { // shouldn't happen 32 return "", nil 33 } 34 return string(buf[:n-1]), nil 35} 36