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

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