...

Source file src/github.com/shirou/gopsutil/internal/common/common_openbsd.go

Documentation: github.com/shirou/gopsutil/internal/common

     1  // +build openbsd
     2  
     3  package common
     4  
     5  import (
     6  	"os"
     7  	"os/exec"
     8  	"strings"
     9  	"unsafe"
    10  
    11  	"golang.org/x/sys/unix"
    12  )
    13  
    14  func DoSysctrl(mib string) ([]string, error) {
    15  	sysctl, err := exec.LookPath("sysctl")
    16  	if err != nil {
    17  		return []string{}, err
    18  	}
    19  	cmd := exec.Command(sysctl, "-n", mib)
    20  	cmd.Env = getSysctrlEnv(os.Environ())
    21  	out, err := cmd.Output()
    22  	if err != nil {
    23  		return []string{}, err
    24  	}
    25  	v := strings.Replace(string(out), "{ ", "", 1)
    26  	v = strings.Replace(string(v), " }", "", 1)
    27  	values := strings.Fields(string(v))
    28  
    29  	return values, nil
    30  }
    31  
    32  func CallSyscall(mib []int32) ([]byte, uint64, error) {
    33  	mibptr := unsafe.Pointer(&mib[0])
    34  	miblen := uint64(len(mib))
    35  
    36  	// get required buffer size
    37  	length := uint64(0)
    38  	_, _, err := unix.Syscall6(
    39  		unix.SYS___SYSCTL,
    40  		uintptr(mibptr),
    41  		uintptr(miblen),
    42  		0,
    43  		uintptr(unsafe.Pointer(&length)),
    44  		0,
    45  		0)
    46  	if err != 0 {
    47  		var b []byte
    48  		return b, length, err
    49  	}
    50  	if length == 0 {
    51  		var b []byte
    52  		return b, length, err
    53  	}
    54  	// get proc info itself
    55  	buf := make([]byte, length)
    56  	_, _, err = unix.Syscall6(
    57  		unix.SYS___SYSCTL,
    58  		uintptr(mibptr),
    59  		uintptr(miblen),
    60  		uintptr(unsafe.Pointer(&buf[0])),
    61  		uintptr(unsafe.Pointer(&length)),
    62  		0,
    63  		0)
    64  	if err != 0 {
    65  		return buf, length, err
    66  	}
    67  
    68  	return buf, length, nil
    69  }
    70  

View as plain text