Home | History | Annotate | Download | only in os
      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 package os
      6 
      7 import (
      8 	"syscall"
      9 	"unsafe"
     10 )
     11 
     12 func executable() (string, error) {
     13 	mib := [4]int32{1 /* CTL_KERN */, 14 /* KERN_PROC */, 12 /* KERN_PROC_PATHNAME */, -1}
     14 
     15 	n := uintptr(0)
     16 	// get length
     17 	_, _, err := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
     18 	if err != 0 {
     19 		return "", err
     20 	}
     21 	if n == 0 { // shouldn't happen
     22 		return "", nil
     23 	}
     24 	buf := make([]byte, n)
     25 	_, _, err = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, uintptr(unsafe.Pointer(&buf[0])), uintptr(unsafe.Pointer(&n)), 0, 0)
     26 	if err != 0 {
     27 		return "", err
     28 	}
     29 	if n == 0 { // shouldn't happen
     30 		return "", nil
     31 	}
     32 	return string(buf[:n-1]), nil
     33 }
     34