github.com/lovishpuri/go-40569/src@v0.0.0-20230519171745-f8623e7c56cf/os/executable_sysctl.go (about) 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 7 package os 8 9 import ( 10 "syscall" 11 "unsafe" 12 ) 13 14 func 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 }