github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/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 // +build freebsd dragonfly 7 8 package os 9 10 import ( 11 "syscall" 12 "unsafe" 13 ) 14 15 func executable() (string, error) { 16 mib := [4]int32{_CTL_KERN, _KERN_PROC, _KERN_PROC_PATHNAME, -1} 17 18 n := uintptr(0) 19 // get length 20 _, _, err := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, 0, uintptr(unsafe.Pointer(&n)), 0, 0) 21 if err != 0 { 22 return "", err 23 } 24 if n == 0 { // shouldn't happen 25 return "", nil 26 } 27 buf := make([]byte, n) 28 _, _, err = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, uintptr(unsafe.Pointer(&buf[0])), uintptr(unsafe.Pointer(&n)), 0, 0) 29 if err != 0 { 30 return "", err 31 } 32 if n == 0 { // shouldn't happen 33 return "", nil 34 } 35 return string(buf[:n-1]), nil 36 }