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

     1  //go:build darwin
     2  // +build darwin
     3  
     4  package common
     5  
     6  import (
     7  	"context"
     8  	"os"
     9  	"os/exec"
    10  	"strings"
    11  	"unsafe"
    12  
    13  	"golang.org/x/sys/unix"
    14  )
    15  
    16  func DoSysctrlWithContext(ctx context.Context, mib string) ([]string, error) {
    17  	sysctl, err := exec.LookPath("sysctl")
    18  	if err != nil {
    19  		return []string{}, err
    20  	}
    21  	cmd := exec.CommandContext(ctx, sysctl, "-n", mib)
    22  	cmd.Env = getSysctrlEnv(os.Environ())
    23  	out, err := cmd.Output()
    24  	if err != nil {
    25  		return []string{}, err
    26  	}
    27  	v := strings.Replace(string(out), "{ ", "", 1)
    28  	v = strings.Replace(string(v), " }", "", 1)
    29  	values := strings.Fields(string(v))
    30  
    31  	return values, nil
    32  }
    33  
    34  func CallSyscall(mib []int32) ([]byte, uint64, error) {
    35  	miblen := uint64(len(mib))
    36  
    37  	// get required buffer size
    38  	length := uint64(0)
    39  	_, _, err := unix.Syscall6(
    40  		202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146
    41  		uintptr(unsafe.Pointer(&mib[0])),
    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  		202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146
    59  		uintptr(unsafe.Pointer(&mib[0])),
    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  }