package host import ( "errors" "os" "path" "strings" "github.com/carlosframework/platform/internal/rootstate" "github.com/carlosframework/platform/internal/safefile" "golang.org/x/sys/unix" ) func claimPredecessorGroup(group string) (rootstate.FileIdentity, bool, error) { var zero rootstate.FileIdentity if !claimPredecessorPlacement(path.Base(group), group) { return zero, false, os.ErrPermission } dir, err := safefile.OpenDir("/sys/fs/cgroup/" + group) if errors.Is(err, os.ErrNotExist) { return zero, false, nil } if err != nil { return zero, false, err } defer dir.Close() var st unix.Statfs_t if err = unix.Fstatfs(int(dir.Fd()), &st); err != nil { return zero, false, err } if st.Type != unix.CGROUP2_SUPER_MAGIC { return zero, false, os.ErrPermission } id, err := rootstate.Identity(dir) if err != nil { return zero, false, err } fd, err := unix.Openat(int(dir.Fd()), "cgroup.events", unix.O_RDONLY|unix.O_CLOEXEC|unix.O_NOFOLLOW, 0) if err != nil { return zero, false, err } file := os.NewFile(uintptr(fd), "cgroup.events") defer file.Close() var buf [1024]byte n, err := file.Read(buf[:]) if err != nil { return zero, false, err } if n == len(buf) { return zero, false, os.ErrPermission } for _, line := range strings.Split(string(buf[:n]), "\n") { if line == "populated 0" { return id, false, nil } if line == "populated 1" { return id, true, nil } } return zero, false, os.ErrPermission } func claimUnitBoot() (string, error) { raw, err := os.ReadFile("/proc/sys/kernel/random/boot_id") if err != nil { return "", err } boot := strings.TrimSpace(string(raw)) if boot == "" { return "", os.ErrPermission } return boot, nil }