//go:build linux package instancectl import ( "errors" "github.com/carlosframework/platform/internal/safefile" "golang.org/x/sys/unix" "os" "path/filepath" ) func claimRootDir(dir string) error { parent, err := safefile.OpenDir(filepath.Dir(dir)) if err != nil { return err } defer parent.Close() if err := unix.Mkdirat(int(parent.Fd()), filepath.Base(dir), 0700); err != nil && !errors.Is(err, os.ErrExist) { return err } fd, err := unix.Openat2(int(parent.Fd()), filepath.Base(dir), &unix.OpenHow{Flags: unix.O_DIRECTORY | unix.O_RDONLY | unix.O_CLOEXEC, Resolve: unix.RESOLVE_NO_SYMLINKS | unix.RESOLVE_NO_MAGICLINKS}) if err != nil { return err } defer unix.Close(fd) var st unix.Stat_t if err := unix.Fstat(fd, &st); err != nil { return err } if st.Uid != uint32(os.Geteuid()) || st.Mode&0022 != 0 { return ErrClaimUnit } return nil }