mirror of
https://github.com/containers/podman.git
synced 2025-09-26 16:25:00 +08:00

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>
48 lines
1015 B
Go
48 lines
1015 B
Go
//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
|
|
}
|