package hostfloor import ( "context" "errors" "fmt" "os" "path/filepath" "sort" "strings" "github.com/carlosframework/platform/internal/rootparticipation" "github.com/carlosframework/platform/internal/safefile" ) func (d Disk) CheckParticipation(ctx context.Context, dataDir string, requireDirectory bool) error { return d.WithParticipation(ctx, func(ctx context.Context, l rootparticipation.Ledger) error { if err := l.Idle(ctx); err != nil { return err } return checkLegacyParticipation(dataDir, false) }, func() error { return checkLegacyParticipation(dataDir, requireDirectory) }) } func checkLegacyParticipation(dataDir string, requireDirectory bool) error { dir := filepath.Join(dataDir, ".hostexec") f, err := safefile.OpenDir(dir) if errors.Is(err, os.ErrNotExist) && !requireDirectory { return nil } if err != nil { return fmt.Errorf("%s cannot be listed: %v", dir, err) } defer f.Close() entries, err := f.ReadDir(-1) if err != nil { return fmt.Errorf("%s cannot be listed: %v", dir, err) } if len(entries) == 0 { return nil } names := make([]string, 0, len(entries)) for _, e := range entries { names = append(names, e.Name()) } sort.Strings(names) if len(names) > 3 { names = append(names[:3], fmt.Sprintf("and %d more", len(entries)-3)) } return fmt.Errorf("this box takes part in a running claim operation (%s holds %s)", dir, strings.Join(names, ", ")) }