diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2022-09-14 14:21:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-14 14:21:30 +0200 |
commit | 82651e5974741aec9d9a0b8926c8ff2f715eed8c (patch) | |
tree | e326843e191473539f2fa1a3d008af85c9c19ffc /pkg | |
parent | ae20f19351c03398d10ba94a31f21dcf3d86f31c (diff) | |
parent | b47ce9a6e0e9fa8e137c8338a08dffa256081b48 (diff) | |
download | podman-82651e5974741aec9d9a0b8926c8ff2f715eed8c.tar.gz podman-82651e5974741aec9d9a0b8926c8ff2f715eed8c.tar.bz2 podman-82651e5974741aec9d9a0b8926c8ff2f715eed8c.zip |
Merge pull request #15769 from dfr/freebsd-stats
Add support for 'podman stats' on FreeBSD
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/rctl/rctl.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/pkg/rctl/rctl.go b/pkg/rctl/rctl.go new file mode 100644 index 000000000..135cc60cb --- /dev/null +++ b/pkg/rctl/rctl.go @@ -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 +} |