-
Notifications
You must be signed in to change notification settings - Fork 2
/
pinfo_darwin.go
executable file
·83 lines (63 loc) · 1.41 KB
/
pinfo_darwin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package pdiscover
import (
"os"
"path/filepath"
"syscall"
"unsafe"
)
const (
CTLKern = 1
KernProcArgs = 38
)
func GetOwnProcPath() (string, error) {
return GetProcPath(os.Getpid())
}
func GetProcPath(pid int) (string, error) {
nameMib := []int32{CTLKern,KernProcArgs,int32(pid),-1}
procArgsLen := uintptr(0)
if err := getSysCtlInfo(nameMib,nil,&procArgsLen); err != nil {
return "",err
}
if procArgsLen == 0 {
return "", ErrInvalidProcArgsLen
}
procArgs := make([]byte, procArgsLen)
if err := getSysCtlInfo(nameMib,&procArgs[0],&procArgsLen); err != nil {
return "",err
}
if procArgsLen == 0 {
return "", ErrInvalidProcArgsLen
}
exePath := exePathFromProcArgs(procArgs)
exePath, err := filepath.Abs(exePath)
if err != nil {
return exePath, err
}
if exePath, err := filepath.EvalSymlinks(exePath); err != nil {
return exePath, err
}
return exePath, nil
}
func getSysCtlInfo(name []int32,value *byte,valueLen *uintptr) error {
_, _, errNum := syscall.Syscall6(syscall.SYS___SYSCTL,
uintptr(unsafe.Pointer(&name[0])),
uintptr(len(name)),
uintptr(unsafe.Pointer(value)),
uintptr(unsafe.Pointer(valueLen)),
0, 0)
if errNum != 0 {
return errNum
}
return nil
}
func GetProcInfo(pid int) map[string]string {
return nil
}
func exePathFromProcArgs(raw []byte) string {
for i, byteVal := range raw {
if byteVal == 0 {
return string(raw[:i])
}
}
return ""
}