github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/toolkit/internal/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  	cmd := exec.Command("sysctl", "-n", mib)
    17  	cmd.Env = getSysctrlEnv(os.Environ())
    18  	out, err := cmd.Output()
    19  	if err != nil {
    20  		return []string{}, err
    21  	}
    22  	v := strings.Replace(string(out), "{ ", "", 1)
    23  	v = strings.Replace(string(v), " }", "", 1)
    24  	values := strings.Fields(string(v))
    25  
    26  	return values, nil
    27  }
    28  
    29  func CallSyscall(mib []int32) ([]byte, uint64, error) {
    30  	mibptr := unsafe.Pointer(&mib[0])
    31  	miblen := uint64(len(mib))
    32  
    33  	// get required buffer size
    34  	length := uint64(0)
    35  	_, _, err := unix.Syscall6(
    36  		unix.SYS___SYSCTL,
    37  		uintptr(mibptr),
    38  		uintptr(miblen),
    39  		0,
    40  		uintptr(unsafe.Pointer(&length)),
    41  		0,
    42  		0)
    43  	if err != 0 {
    44  		var b []byte
    45  		return b, length, err
    46  	}
    47  	if length == 0 {
    48  		var b []byte
    49  		return b, length, err
    50  	}
    51  	// get proc info itself
    52  	buf := make([]byte, length)
    53  	_, _, err = unix.Syscall6(
    54  		unix.SYS___SYSCTL,
    55  		uintptr(mibptr),
    56  		uintptr(miblen),
    57  		uintptr(unsafe.Pointer(&buf[0])),
    58  		uintptr(unsafe.Pointer(&length)),
    59  		0,
    60  		0)
    61  	if err != 0 {
    62  		return buf, length, err
    63  	}
    64  
    65  	return buf, length, nil
    66  }