github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/sysutils/pid_path_darwin.go (about)

     1  // Copyright 2017 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  package sysutils
     6  
     7  import (
     8  	"bytes"
     9  	"syscall"
    10  	"unsafe"
    11  )
    12  
    13  const (
    14  	procpidpathinfo     = 11
    15  	procpidpathinfosize = 1024
    16  	proccallnumpidinfo  = 2
    17  )
    18  
    19  // GetExecPathFromPID returns the process's executable path for given PID.
    20  func GetExecPathFromPID(pid uint32) (string, error) {
    21  	buf := make([]byte, procpidpathinfosize)
    22  	_, _, errno := syscall.Syscall6(
    23  		syscall.SYS_PROC_INFO,
    24  		proccallnumpidinfo,
    25  		uintptr(pid),
    26  		procpidpathinfo,
    27  		0,
    28  		uintptr(unsafe.Pointer(&buf[0])),
    29  		procpidpathinfosize)
    30  	if errno != 0 {
    31  		return "", errno
    32  	}
    33  	firstZero := bytes.IndexByte(buf, 0)
    34  	if firstZero <= 0 {
    35  		return "", nil
    36  	}
    37  	return string(buf[:firstZero]), nil
    38  }