From 1ce6c41d3f5aa04128b727b18002a7fbb73163b2 Mon Sep 17 00:00:00 2001 From: Charlotte Koch Date: Thu, 11 Oct 2018 20:16:52 -0700 Subject: [PATCH 1/4] add netbsd support I literally copypasted the openbsd go-ps file to netbsd, REALLY requires a closer look. But AFAICT that's the only truly nonportable code. --- go/install/install_unix.go | 2 +- go/logger/redirect_stderr_nix.go | 2 +- .../keybase/go-ps/process_netbsd.go | 302 ++++++++++++++++++ 3 files changed, 304 insertions(+), 2 deletions(-) create mode 100644 go/vendor/github.com/keybase/go-ps/process_netbsd.go diff --git a/go/install/install_unix.go b/go/install/install_unix.go index 1cbd0b1fc40d..12ec505a65c6 100644 --- a/go/install/install_unix.go +++ b/go/install/install_unix.go @@ -1,7 +1,7 @@ // Copyright 2015 Keybase, Inc. All rights reserved. Use of // this source code is governed by the included BSD license. -// +build linux freebsd openbsd +// +build linux freebsd netbsd openbsd package install diff --git a/go/logger/redirect_stderr_nix.go b/go/logger/redirect_stderr_nix.go index 617782446b29..89f2318e4e10 100644 --- a/go/logger/redirect_stderr_nix.go +++ b/go/logger/redirect_stderr_nix.go @@ -1,7 +1,7 @@ // Copyright 2016 Keybase, Inc. All rights reserved. Use of // this source code is governed by the included BSD license. -// +build darwin freebsd openbsd +// +build darwin freebsd netbsd openbsd package logger diff --git a/go/vendor/github.com/keybase/go-ps/process_netbsd.go b/go/vendor/github.com/keybase/go-ps/process_netbsd.go new file mode 100644 index 000000000000..44a09a9145e0 --- /dev/null +++ b/go/vendor/github.com/keybase/go-ps/process_netbsd.go @@ -0,0 +1,302 @@ +// +build netbsd,amd64 + +package ps + +import ( + "bytes" + "encoding/binary" + "fmt" + "syscall" + "unsafe" +) + +// copied from sys/sysctl.h +const ( + CTL_KERN = 1 + KERN_PROC = 66 + KERN_PROC_PID = 1 + KERN_PROC_ARGS = 55 + KERN_PROC_ARGV = 1 + KERN_PROC_ALL = 0 +) + +/* Generated via cgo: + +$ cat /tmp/gen_defs.go +// +build ignore +package ps +// #include +// #include +import "C" + +type Kinfo_proc C.struct_kinfo_proc + +$ go tool cgo -godefs temp.go + +*/ + +type Kinfo_proc struct { + Ki_forw uint64 + Ki_back uint64 + Ki_paddr uint64 + Ki_addr uint64 + Ki_fd uint64 + Ki_stats uint64 + Ki_limit uint64 + Ki_vmspace uint64 + Ki_sigacts uint64 + Ki_sess uint64 + Ki_tsess uint64 + Ki_ru uint64 + Ki_eflag int32 + Ki_exitsig int32 + Ki_flag int32 + Ki_pid int32 + Ki_ppid int32 + Ki_sid int32 + Ki_x_pgid int32 + Ki_tpgid int32 + Ki_uid uint32 + Ki_ruid uint32 + Ki_gid uint32 + Ki_rgid uint32 + Ki_groups [16]uint32 + Ki_ngroups int16 + Ki_jobc int16 + Ki_tdev uint32 + Ki_estcpu uint32 + Ki_rtime_sec uint32 + Ki_rtime_usec uint32 + Ki_cpticks int32 + Ki_pctcpu uint32 + Ki_swtime uint32 + Ki_slptime uint32 + Ki_schedflags int32 + Ki_uticks uint64 + Ki_sticks uint64 + Ki_iticks uint64 + Ki_tracep uint64 + Ki_traceflag int32 + Ki_holdcnt int32 + Ki_siglist int32 + Ki_sigmask uint32 + Ki_sigignore uint32 + Ki_sigcatch uint32 + Ki_stat int8 + Ki_priority uint8 + Ki_usrpri uint8 + Ki_nice uint8 + Ki_xstat uint16 + Ki_acflag uint16 + //Ki_comm [24]int8 + Ki_comm [20]byte + Ki_wmesg [8]int8 + Ki_wchan uint64 + Ki_login [32]int8 + Ki_vm_rssize int32 + Ki_vm_tsize int32 + Ki_vm_dsize int32 + Ki_vm_ssize int32 + Ki_uvalid int64 + Ki_ustart_sec uint64 + Ki_ustart_usec uint32 + Ki_uutime_sec uint32 + Ki_uutime_usec uint32 + Ki_ustime_sec uint32 + Ki_ustime_usec uint32 + Ki_pad_cgo_0 [4]byte + Ki_uru_maxrss uint64 + Ki_uru_ixrss uint64 + Ki_uru_idrss uint64 + Ki_uru_isrss uint64 + Ki_uru_minflt uint64 + Ki_uru_majflt uint64 + Ki_uru_nswap uint64 + Ki_uru_inblock uint64 + Ki_uru_oublock uint64 + Ki_uru_msgsnd uint64 + Ki_uru_msgrcv uint64 + Ki_uru_nsignals uint64 + Ki_uru_nvcsw uint64 + Ki_uru_nivcsw uint64 + Ki_uctime_sec uint32 + Ki_uctime_usec uint32 + Ki_psflags int32 + Ki_spare int32 + Ki_svuid uint32 + Ki_svgid uint32 + Ki_emul [8]int8 + Ki_rlim_rss_cur uint64 + Ki_cpuid uint64 + Ki_vm_map_size uint64 + Ki_tid int32 + Ki_rtableid uint32 +} + +var proc_k_size = unsafe.Sizeof(Kinfo_proc{}) + +// UnixProcess is an implementation of Process that contains Unix-specific +// fields and information. +type UnixProcess struct { + pid int + ppid int + state rune + pgrp int + sid int + + binary string +} + +// Pid returns process id +func (p *UnixProcess) Pid() int { + return p.pid +} + +// PPid returns parent process id +func (p *UnixProcess) PPid() int { + return p.ppid +} + +// Executable returns process executable name +func (p *UnixProcess) Executable() string { + return p.binary +} + +// Path returns path to process executable +func (p *UnixProcess) Path() (string, error) { + // On OpenBSD we don't have the actual path of a binary, the next + // best thing we can do is walk $PATH to hopefully find the binary. + // More info here: https://github.com/kardianos/osext/commit/b4814f465fb1f92d46e37f7ef84d732ece7c3e3a + return "", fmt.Errorf("Unsupported") +} + +// Refresh reloads all the data associated with this process. +func (p *UnixProcess) Refresh() error { + mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PID, int32(p.pid), int32(proc_k_size), 1} + + buf, length, err := call_syscall(mib) + if err != nil { + return err + } + if length != uint64(proc_k_size) { + return err + } + + k, err := parse_kinfo_proc(buf) + if err != nil { + return err + } + + p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k) + return nil +} + +func copy_params(k *Kinfo_proc) (int, int, int, string) { + n := -1 + for i, b := range k.Ki_comm { + if b == 0 { + break + } + n = i + 1 + } + comm := string(k.Ki_comm[:n]) + + return int(k.Ki_ppid), int(k.Ki_x_pgid), int(k.Ki_sid), comm +} + +func findProcess(pid int) (Process, error) { + mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PID, int32(pid), int32(proc_k_size), 1} + + _, _, err := call_syscall(mib) + if err != nil { + return nil, err + } + + return newUnixProcess(pid) +} + +func processes() ([]Process, error) { + results := make([]Process, 0, 50) + + mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0, int32(proc_k_size), 400} + buf, length, err := call_syscall(mib) + if err != nil { + return results, err + } + + // get kinfo_proc size + procinfo_len := int(proc_k_size) + count := int(length / uint64(proc_k_size)) + + // parse buf to procs + for i := 0; i < count; i++ { + b := buf[i*procinfo_len : i*procinfo_len+procinfo_len] + k, err := parse_kinfo_proc(b) + if err != nil { + continue + } + p, err := newUnixProcess(int(k.Ki_pid)) + if err != nil { + continue + } + p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k) + + results = append(results, p) + } + + return results, nil +} + +func parse_kinfo_proc(buf []byte) (Kinfo_proc, error) { + var k Kinfo_proc + br := bytes.NewReader(buf) + err := binary.Read(br, binary.LittleEndian, &k) + if err != nil { + return k, err + } + + return k, nil +} + +func call_syscall(mib []int32) ([]byte, uint64, error) { + miblen := uint64(len(mib)) + + // get required buffer size + length := uint64(0) + _, _, err := syscall.RawSyscall6( + syscall.SYS___SYSCTL, + uintptr(unsafe.Pointer(&mib[0])), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + b := make([]byte, 0) + return b, length, err + } + if length == 0 { + b := make([]byte, 0) + return b, length, err + } + // get proc info itself + buf := make([]byte, length) + _, _, err = syscall.RawSyscall6( + syscall.SYS___SYSCTL, + uintptr(unsafe.Pointer(&mib[0])), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} + +func newUnixProcess(pid int) (*UnixProcess, error) { + p := &UnixProcess{pid: pid} + return p, p.Refresh() +} From e0542c14767b5e3e1c91cf4096d73bc3cef92856 Mon Sep 17 00:00:00 2001 From: atomicules Date: Mon, 19 Aug 2019 21:19:03 +0100 Subject: [PATCH 2/4] Building on (Net)BSD again. Building broke on BSDs due to these: - https://github.com/keybase/client/pull/16949 - https://github.com/keybase/client/commit/38900b9cfacfb03c83619191379e6d84d3dd61ec AFAICT all that is needed are the following changes to get things building again. Tested on NetBSD, but guessing the same will apply to OpenBSD and FreeBSD hence why also all those build headers. Renamed stop_linux.go to stop_nix.go to reflect applicability. _Probably_ this works fine. On NetBSD I am only concerned with the command line so don't care about stopping the GUI. One thing to note with regards to running on NetBSD - using Linux Emulation so you have the procfs mounted helps a lot. In fact I don't think the process_netbsd.go file in go-ps is required at all then. NetBSD can just use the Linux one (after adding itself to the build header) --- go/client/platform_specific_ctl_commands_other.go | 2 +- go/install/{stop_linux.go => stop_nix.go} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename go/install/{stop_linux.go => stop_nix.go} (97%) diff --git a/go/client/platform_specific_ctl_commands_other.go b/go/client/platform_specific_ctl_commands_other.go index 2882ff082f73..ad70a3a2014b 100644 --- a/go/client/platform_specific_ctl_commands_other.go +++ b/go/client/platform_specific_ctl_commands_other.go @@ -1,6 +1,6 @@ // Copyright 2019 Keybase, Inc. All rights reserved. Use of // this source code is governed by the included BSD license. -// +build darwin windows +// +build darwin windows netbsd openbsd freebsd package client diff --git a/go/install/stop_linux.go b/go/install/stop_nix.go similarity index 97% rename from go/install/stop_linux.go rename to go/install/stop_nix.go index 0232505ee959..bebca0d06f93 100644 --- a/go/install/stop_linux.go +++ b/go/install/stop_nix.go @@ -1,7 +1,7 @@ // Copyright 2019 Keybase, Inc. All rights reserved. Use of // this source code is governed by the included BSD license. -// +build !windows,!darwin +// +build !windows,!darwin netbsd openbsd freebsd package install From 80ebf1be2b5145791a8be11d4a8ab0cb348e7a4b Mon Sep 17 00:00:00 2001 From: atomicules Date: Mon, 19 Aug 2019 22:13:38 +0100 Subject: [PATCH 3/4] Use Linux emulation on NetBSD for go-ps References: https://github.com/atomicules/go-ps/commit/d643112511912e4595a5b66146777fdc39702691 --- .../keybase/go-ps/process_netbsd.go | 302 ------------------ .../github.com/keybase/go-ps/process_unix.go | 2 +- 2 files changed, 1 insertion(+), 303 deletions(-) delete mode 100644 go/vendor/github.com/keybase/go-ps/process_netbsd.go diff --git a/go/vendor/github.com/keybase/go-ps/process_netbsd.go b/go/vendor/github.com/keybase/go-ps/process_netbsd.go deleted file mode 100644 index 44a09a9145e0..000000000000 --- a/go/vendor/github.com/keybase/go-ps/process_netbsd.go +++ /dev/null @@ -1,302 +0,0 @@ -// +build netbsd,amd64 - -package ps - -import ( - "bytes" - "encoding/binary" - "fmt" - "syscall" - "unsafe" -) - -// copied from sys/sysctl.h -const ( - CTL_KERN = 1 - KERN_PROC = 66 - KERN_PROC_PID = 1 - KERN_PROC_ARGS = 55 - KERN_PROC_ARGV = 1 - KERN_PROC_ALL = 0 -) - -/* Generated via cgo: - -$ cat /tmp/gen_defs.go -// +build ignore -package ps -// #include -// #include -import "C" - -type Kinfo_proc C.struct_kinfo_proc - -$ go tool cgo -godefs temp.go - -*/ - -type Kinfo_proc struct { - Ki_forw uint64 - Ki_back uint64 - Ki_paddr uint64 - Ki_addr uint64 - Ki_fd uint64 - Ki_stats uint64 - Ki_limit uint64 - Ki_vmspace uint64 - Ki_sigacts uint64 - Ki_sess uint64 - Ki_tsess uint64 - Ki_ru uint64 - Ki_eflag int32 - Ki_exitsig int32 - Ki_flag int32 - Ki_pid int32 - Ki_ppid int32 - Ki_sid int32 - Ki_x_pgid int32 - Ki_tpgid int32 - Ki_uid uint32 - Ki_ruid uint32 - Ki_gid uint32 - Ki_rgid uint32 - Ki_groups [16]uint32 - Ki_ngroups int16 - Ki_jobc int16 - Ki_tdev uint32 - Ki_estcpu uint32 - Ki_rtime_sec uint32 - Ki_rtime_usec uint32 - Ki_cpticks int32 - Ki_pctcpu uint32 - Ki_swtime uint32 - Ki_slptime uint32 - Ki_schedflags int32 - Ki_uticks uint64 - Ki_sticks uint64 - Ki_iticks uint64 - Ki_tracep uint64 - Ki_traceflag int32 - Ki_holdcnt int32 - Ki_siglist int32 - Ki_sigmask uint32 - Ki_sigignore uint32 - Ki_sigcatch uint32 - Ki_stat int8 - Ki_priority uint8 - Ki_usrpri uint8 - Ki_nice uint8 - Ki_xstat uint16 - Ki_acflag uint16 - //Ki_comm [24]int8 - Ki_comm [20]byte - Ki_wmesg [8]int8 - Ki_wchan uint64 - Ki_login [32]int8 - Ki_vm_rssize int32 - Ki_vm_tsize int32 - Ki_vm_dsize int32 - Ki_vm_ssize int32 - Ki_uvalid int64 - Ki_ustart_sec uint64 - Ki_ustart_usec uint32 - Ki_uutime_sec uint32 - Ki_uutime_usec uint32 - Ki_ustime_sec uint32 - Ki_ustime_usec uint32 - Ki_pad_cgo_0 [4]byte - Ki_uru_maxrss uint64 - Ki_uru_ixrss uint64 - Ki_uru_idrss uint64 - Ki_uru_isrss uint64 - Ki_uru_minflt uint64 - Ki_uru_majflt uint64 - Ki_uru_nswap uint64 - Ki_uru_inblock uint64 - Ki_uru_oublock uint64 - Ki_uru_msgsnd uint64 - Ki_uru_msgrcv uint64 - Ki_uru_nsignals uint64 - Ki_uru_nvcsw uint64 - Ki_uru_nivcsw uint64 - Ki_uctime_sec uint32 - Ki_uctime_usec uint32 - Ki_psflags int32 - Ki_spare int32 - Ki_svuid uint32 - Ki_svgid uint32 - Ki_emul [8]int8 - Ki_rlim_rss_cur uint64 - Ki_cpuid uint64 - Ki_vm_map_size uint64 - Ki_tid int32 - Ki_rtableid uint32 -} - -var proc_k_size = unsafe.Sizeof(Kinfo_proc{}) - -// UnixProcess is an implementation of Process that contains Unix-specific -// fields and information. -type UnixProcess struct { - pid int - ppid int - state rune - pgrp int - sid int - - binary string -} - -// Pid returns process id -func (p *UnixProcess) Pid() int { - return p.pid -} - -// PPid returns parent process id -func (p *UnixProcess) PPid() int { - return p.ppid -} - -// Executable returns process executable name -func (p *UnixProcess) Executable() string { - return p.binary -} - -// Path returns path to process executable -func (p *UnixProcess) Path() (string, error) { - // On OpenBSD we don't have the actual path of a binary, the next - // best thing we can do is walk $PATH to hopefully find the binary. - // More info here: https://github.com/kardianos/osext/commit/b4814f465fb1f92d46e37f7ef84d732ece7c3e3a - return "", fmt.Errorf("Unsupported") -} - -// Refresh reloads all the data associated with this process. -func (p *UnixProcess) Refresh() error { - mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PID, int32(p.pid), int32(proc_k_size), 1} - - buf, length, err := call_syscall(mib) - if err != nil { - return err - } - if length != uint64(proc_k_size) { - return err - } - - k, err := parse_kinfo_proc(buf) - if err != nil { - return err - } - - p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k) - return nil -} - -func copy_params(k *Kinfo_proc) (int, int, int, string) { - n := -1 - for i, b := range k.Ki_comm { - if b == 0 { - break - } - n = i + 1 - } - comm := string(k.Ki_comm[:n]) - - return int(k.Ki_ppid), int(k.Ki_x_pgid), int(k.Ki_sid), comm -} - -func findProcess(pid int) (Process, error) { - mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_PID, int32(pid), int32(proc_k_size), 1} - - _, _, err := call_syscall(mib) - if err != nil { - return nil, err - } - - return newUnixProcess(pid) -} - -func processes() ([]Process, error) { - results := make([]Process, 0, 50) - - mib := []int32{CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0, int32(proc_k_size), 400} - buf, length, err := call_syscall(mib) - if err != nil { - return results, err - } - - // get kinfo_proc size - procinfo_len := int(proc_k_size) - count := int(length / uint64(proc_k_size)) - - // parse buf to procs - for i := 0; i < count; i++ { - b := buf[i*procinfo_len : i*procinfo_len+procinfo_len] - k, err := parse_kinfo_proc(b) - if err != nil { - continue - } - p, err := newUnixProcess(int(k.Ki_pid)) - if err != nil { - continue - } - p.ppid, p.pgrp, p.sid, p.binary = copy_params(&k) - - results = append(results, p) - } - - return results, nil -} - -func parse_kinfo_proc(buf []byte) (Kinfo_proc, error) { - var k Kinfo_proc - br := bytes.NewReader(buf) - err := binary.Read(br, binary.LittleEndian, &k) - if err != nil { - return k, err - } - - return k, nil -} - -func call_syscall(mib []int32) ([]byte, uint64, error) { - miblen := uint64(len(mib)) - - // get required buffer size - length := uint64(0) - _, _, err := syscall.RawSyscall6( - syscall.SYS___SYSCTL, - uintptr(unsafe.Pointer(&mib[0])), - uintptr(miblen), - 0, - uintptr(unsafe.Pointer(&length)), - 0, - 0) - if err != 0 { - b := make([]byte, 0) - return b, length, err - } - if length == 0 { - b := make([]byte, 0) - return b, length, err - } - // get proc info itself - buf := make([]byte, length) - _, _, err = syscall.RawSyscall6( - syscall.SYS___SYSCTL, - uintptr(unsafe.Pointer(&mib[0])), - uintptr(miblen), - uintptr(unsafe.Pointer(&buf[0])), - uintptr(unsafe.Pointer(&length)), - 0, - 0) - if err != 0 { - return buf, length, err - } - - return buf, length, nil -} - -func newUnixProcess(pid int) (*UnixProcess, error) { - p := &UnixProcess{pid: pid} - return p, p.Refresh() -} diff --git a/go/vendor/github.com/keybase/go-ps/process_unix.go b/go/vendor/github.com/keybase/go-ps/process_unix.go index f4e8da23d59c..8c89b7ecb6ac 100644 --- a/go/vendor/github.com/keybase/go-ps/process_unix.go +++ b/go/vendor/github.com/keybase/go-ps/process_unix.go @@ -1,4 +1,4 @@ -// +build linux +// +build linux netbsd package ps From 8d0b2aa020cb4cd3284ccb8037c2045761290d31 Mon Sep 17 00:00:00 2001 From: heronhaye Date: Tue, 27 Aug 2019 13:59:37 -0400 Subject: [PATCH 4/4] Vendor --- go/vendor/github.com/keybase/go-ps/process_openbsd.go | 2 +- go/vendor/vendor.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go/vendor/github.com/keybase/go-ps/process_openbsd.go b/go/vendor/github.com/keybase/go-ps/process_openbsd.go index 0ce66edac47b..51c446dd39e7 100644 --- a/go/vendor/github.com/keybase/go-ps/process_openbsd.go +++ b/go/vendor/github.com/keybase/go-ps/process_openbsd.go @@ -1,4 +1,4 @@ -// +build openbsd,amd64 +// +build openbsd package ps diff --git a/go/vendor/vendor.json b/go/vendor/vendor.json index b942275b58e4..b66057938a45 100644 --- a/go/vendor/vendor.json +++ b/go/vendor/vendor.json @@ -668,10 +668,10 @@ "revisionTime": "2018-10-16T18:57:45Z" }, { - "checksumSHA1": "07FctQiwHCBvhiXp2mTLc8e0ll8=", + "checksumSHA1": "iC6oxp3NRhZJW5+OmHWH56j1dv0=", "path": "github.com/keybase/go-ps", - "revision": "9c11ca40a47944f49e0784b77a66636cb098445a", - "revisionTime": "2016-08-09T20:56:21Z" + "revision": "91aafc93ba19d1988cff338c1929d35b6c6f5b50", + "revisionTime": "2019-08-27T17:51:25Z" }, { "checksumSHA1": "KNf4CdZexyFjpEugzBv3b7YJs4U=",