//go:build linux package host import ( "errors" "path/filepath" "github.com/carlosframework/platform/internal/hostbox" "github.com/carlosframework/platform/internal/instancefs" "golang.org/x/sys/unix" ) // checkServingArtifactAbsence checks the root-recorded source directory and // all four source names through one descriptor. Missing parents, links and // replacement directories are errors, never evidence of absent artifacts. func checkServingArtifactAbsence(db string, expected servingArtifactDirectory) error { dir, err := instancefs.OpenDirBeneath(filepath.Dir(db), ".") if err != nil { return err } defer dir.Close() var stat unix.Statx_t if err = unix.Statx(int(dir.Fd()), "", unix.AT_EMPTY_PATH|unix.AT_SYMLINK_NOFOLLOW, unix.STATX_BASIC_STATS|unix.STATX_MNT_ID, &stat); err != nil { return err } if stat.Mask&unix.STATX_MNT_ID == 0 || unix.Mkdev(stat.Dev_major, stat.Dev_minor) != expected.Device || stat.Ino != expected.Inode || stat.Mnt_id != expected.Mount { return hostbox.ErrChanged } for _, suffix := range []string{"", ".gen", "-wal", "-shm"} { var item unix.Stat_t err = unix.Fstatat(int(dir.Fd()), filepath.Base(db)+suffix, &item, unix.AT_SYMLINK_NOFOLLOW) if err == nil { return hostbox.ErrChanged } if !errors.Is(err, unix.ENOENT) { return err } } return nil } func servingAgentDirectory(db string) (servingArtifactDirectory, error) { dir, err := instancefs.OpenDirBeneath(filepath.Dir(db), ".") if err != nil { return servingArtifactDirectory{}, err } defer dir.Close() return servingParkDirID(dir) }