mirror of
https://github.com/containers/podman.git
synced 2025-10-12 16:56:32 +08:00
pkg/rctl: Add a simple FreeBSD RCTL library
Initially just supporting just rctl_get_racct for (*Container).GetContainerStats. [NO NEW TESTS NEEDED] we are not running any FreeBSD tests in CI Signed-off-by: Doug Rabson <dfr@rabson.org>
This commit is contained in:
47
pkg/rctl/rctl.go
Normal file
47
pkg/rctl/rctl.go
Normal file
@ -0,0 +1,47 @@
|
||||
//go:build freebsd
|
||||
// +build freebsd
|
||||
|
||||
package rctl
|
||||
|
||||
// #include <sys/rctl.h>
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func GetRacct(filter string) (map[string]uint64, error) {
|
||||
bp, err := syscall.ByteSliceFromString(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var buf [1024]byte
|
||||
_, _, errno := syscall.Syscall6(syscall.SYS_RCTL_GET_RACCT,
|
||||
uintptr(unsafe.Pointer(&bp[0])),
|
||||
uintptr(len(bp)),
|
||||
uintptr(unsafe.Pointer(&buf[0])),
|
||||
uintptr(len(buf)), 0, 0)
|
||||
if errno != 0 {
|
||||
return nil, fmt.Errorf("error calling rctl_get_racct with filter %s: %v", errno)
|
||||
}
|
||||
len := bytes.IndexByte(buf[:], byte(0))
|
||||
entries := strings.Split(string(buf[:len]), ",")
|
||||
res := make(map[string]uint64)
|
||||
for _, entry := range entries {
|
||||
kv := strings.SplitN(entry, "=", 2)
|
||||
key := kv[0]
|
||||
val, err := strconv.ParseUint(kv[1], 10, 0)
|
||||
if err != nil {
|
||||
logrus.Warnf("unexpected rctl entry, ignoring: %s", entry)
|
||||
}
|
||||
res[key] = val
|
||||
}
|
||||
return res, nil
|
||||
}
|
Reference in New Issue
Block a user