//go:build !linux package safefile import ( "fmt" "io" "os" "path/filepath" ) func MkdirAll(path string, mode os.FileMode) error { return os.MkdirAll(path, mode) } func OpenFile(path string, flags int, mode os.FileMode) (*os.File, error) { return os.OpenFile(path, flags, mode) } func Remove(path string) error { return os.Remove(path) } func Write(path string, mode os.FileMode, write func(io.Writer) error) error { f, err := os.CreateTemp(filepath.Dir(path), ".carlos-write-*") if err != nil { return err } defer os.Remove(f.Name()) defer f.Close() if err := write(f); err != nil { return err } if err := f.Chmod(mode); err != nil { return err } if err := f.Sync(); err != nil { return err } if err := f.Close(); err != nil { return err } return os.Rename(f.Name(), path) } func OpenDir(path string) (*os.File, error) { st, err := os.Lstat(path) if err != nil { return nil, err } if !st.IsDir() { return nil, fmt.Errorf("%s is not a directory", path) } f, err := os.Open(path) if err != nil { return nil, err } st, err = f.Stat() if err != nil { f.Close() return nil, err } if !st.IsDir() { f.Close() return nil, fmt.Errorf("%s is not a directory", path) } return f, nil }