//go:build linux package instancectl import ( "fmt" "net" "os" "github.com/carlosframework/platform/internal/safefile" "golang.org/x/sys/unix" ) func claimListenExecSocket(source string) (*net.UnixListener, error) { dir, err := safefile.OpenDir(source) if err != nil { return nil, err } defer dir.Close() var parent unix.Stat_t if err := unix.Fstat(int(dir.Fd()), &parent); err != nil { return nil, err } if parent.Uid != uint32(os.Geteuid()) || parent.Mode&0022 != 0 { return nil, ErrClaimUnit } path := fmt.Sprintf("/proc/self/fd/%d/exec.sock", dir.Fd()) ln, err := net.ListenUnix("unix", &net.UnixAddr{Name: path, Net: "unix"}) if err != nil { return nil, err } ln.SetUnlinkOnClose(false) fail := func(err error) (*net.UnixListener, error) { ln.Close(); return nil, err } fd, err := unix.Openat(int(dir.Fd()), "exec.sock", unix.O_PATH|unix.O_NOFOLLOW|unix.O_CLOEXEC, 0) if err != nil { return fail(err) } defer unix.Close(fd) var st unix.Stat_t if err := unix.Fstat(fd, &st); err != nil { return fail(err) } if st.Mode&unix.S_IFMT != unix.S_IFSOCK || st.Uid != uint32(os.Geteuid()) { return fail(ErrClaimUnit) } if err := unix.Fchmodat(fd, "", 0666, unix.AT_EMPTY_PATH); err != nil { return fail(err) } return ln, nil }