github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/toolkit/internal/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  	cmd := exec.CommandContext(ctx, "sysctl", "-n", mib)
    18  	cmd.Env = getSysctrlEnv(os.Environ())
    19  	out, err := cmd.Output()
    20  	if err != nil {
    21  		return []string{}, err
    22  	}
    23  	v := strings.Replace(string(out), "{ ", "", 1)
    24  	v = strings.Replace(string(v), " }", "", 1)
    25  	values := strings.Fields(string(v))
    26  
    27  	return values, nil
    28  }
    29  
    30  func CallSyscall(mib []int32) ([]byte, uint64, error) {
    31  	miblen := uint64(len(mib))
    32  
    33  	// get required buffer size
    34  	length := uint64(0)
    35  	_, _, err := unix.Syscall6(
    36  		202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146
    37  		uintptr(unsafe.Pointer(&mib[0])),
    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  		202, // unix.SYS___SYSCTL https://github.com/golang/sys/blob/76b94024e4b621e672466e8db3d7f084e7ddcad2/unix/zsysnum_darwin_amd64.go#L146
    55  		uintptr(unsafe.Pointer(&mib[0])),
    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  }