mirror of
https://github.com/AlchemillaHQ/Sylve.git
synced 2026-06-15 00:56:36 +03:00
111 lines
1.9 KiB
Go
111 lines
1.9 KiB
Go
// SPDX-License-Identifier: BSD-2-Clause
|
|
//
|
|
// Copyright (c) 2025 The FreeBSD Foundation.
|
|
//
|
|
// This software was developed by Hayzam Sherif <hayzam@alchemilla.io>
|
|
// of Alchemilla Ventures Pvt. Ltd. <hello@alchemilla.io>,
|
|
// under sponsorship from the FreeBSD Foundation.
|
|
|
|
//go:build darwin || freebsd || openbsd || netbsd
|
|
|
|
package sysctl
|
|
|
|
/*
|
|
#include <sys/types.h>
|
|
#include <sys/sysctl.h>
|
|
#include <stdlib.h>
|
|
*/
|
|
import "C"
|
|
|
|
import "unsafe"
|
|
|
|
func GetInt64(name string) (int64, error) {
|
|
var value int64
|
|
oldlen := C.size_t(unsafe.Sizeof(value))
|
|
|
|
nameC := C.CString(name)
|
|
defer C.free(unsafe.Pointer(nameC))
|
|
|
|
_, err := C.sysctlbyname(
|
|
nameC,
|
|
unsafe.Pointer(&value),
|
|
&oldlen,
|
|
nil,
|
|
0,
|
|
)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return value, nil
|
|
}
|
|
|
|
func GetString(name string) (string, error) {
|
|
b, err := GetBytes(name)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if len(b) > 0 && b[len(b)-1] == 0 {
|
|
b = b[:len(b)-1]
|
|
}
|
|
|
|
return string(b), nil
|
|
}
|
|
|
|
func GetBytes(name string) ([]byte, error) {
|
|
nameC := C.CString(name)
|
|
defer C.free(unsafe.Pointer(nameC))
|
|
|
|
var oldlen C.size_t
|
|
|
|
_, err := C.sysctlbyname(nameC, nil, &oldlen, nil, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if oldlen == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
buf := make([]byte, oldlen)
|
|
|
|
_, err = C.sysctlbyname(
|
|
nameC,
|
|
unsafe.Pointer(&buf[0]),
|
|
&oldlen,
|
|
nil,
|
|
0,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return buf[:oldlen], nil
|
|
}
|
|
|
|
func Set(name string, value []byte) error {
|
|
nameC := C.CString(name)
|
|
defer C.free(unsafe.Pointer(nameC))
|
|
|
|
var newp unsafe.Pointer
|
|
newlen := C.size_t(len(value))
|
|
|
|
if len(value) > 0 {
|
|
newp = unsafe.Pointer(&value[0])
|
|
}
|
|
|
|
_, err := C.sysctlbyname(nameC, nil, nil, newp, newlen)
|
|
return err
|
|
}
|
|
|
|
func SetInt32(name string, value int32) error {
|
|
nameC := C.CString(name)
|
|
defer C.free(unsafe.Pointer(nameC))
|
|
|
|
newlen := C.size_t(unsafe.Sizeof(value))
|
|
newp := unsafe.Pointer(&value)
|
|
|
|
_, err := C.sysctlbyname(nameC, nil, nil, newp, newlen)
|
|
return err
|
|
}
|