github.com/gofiber/fiber/v2@v2.47.0/internal/gopsutil/common/common_openbsd.go (about)

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