diff --git a/process_openbsd.go b/process_openbsd.go new file mode 100644 index 0000000..1ee3cac --- /dev/null +++ b/process_openbsd.go @@ -0,0 +1,68 @@ +// +build openbsd + +package ps + +// #cgo LDFLAGS: -lkvm +// #include "process_openbsd.h" +import "C" + +var openbsdProcs []Process + +func findProcess(pid int) (Process, error) { + ps, err := processes() + if err != nil { + return nil, err + } + + for _, p := range ps { + if p.Pid() == pid { + return p, nil + } + } + + return nil, nil +} + +type OpenBSDProcess struct { + pid int + ppid int + binary string +} + +func newOpenBSDProcess() *OpenBSDProcess { + return &OpenBSDProcess{} +} + +func (p *OpenBSDProcess) Pid() int { + return p.pid +} + +func (p *OpenBSDProcess) PPid() int { + return p.ppid +} + +func (p *OpenBSDProcess) Executable() string { + return p.binary +} + +//export go_openbsd_append_proc +func go_openbsd_append_proc(pid C.pid_t, ppid C.pid_t, comm *C.char) { + proc := &OpenBSDProcess{ + pid: int(pid), + ppid: int(ppid), + binary: C.GoString(comm), + } + + openbsdProcs = append(openbsdProcs, proc) +} + +func processes() ([]Process, error) { + openbsdProcs = make([]Process, 0, 50) + + _, err := C.openbsdProcesses() + if err != nil { + return nil, err + } + + return openbsdProcs, nil +} diff --git a/process_openbsd.h b/process_openbsd.h new file mode 100644 index 0000000..6002a3c --- /dev/null +++ b/process_openbsd.h @@ -0,0 +1,31 @@ +// +build openbsd + +#include +#include +#include +#include +#include +#include + +extern void go_openbsd_append_proc(pid_t, pid_t, char *); + +static inline int openbsdProcesses() { + int nentries = 0; + int i = 0; + char errbuf[_POSIX2_LINE_MAX]; + struct kinfo_proc *result = NULL; + kvm_t *kernel = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, errbuf); + if (!kernel) { + return errno; + } + result = kvm_getprocs(kernel, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc), &nentries); + for (i = 0; i < nentries; i++) { + struct kinfo_proc *single = &result[i]; + go_openbsd_append_proc( + single->p_pid, + single->p_ppid, + single->p_comm); + } + + return 0; +}