2022-03-28 20:23:47 +00:00
|
|
|
//go:build !windows
|
2017-04-15 08:53:12 +00:00
|
|
|
// +build !windows
|
|
|
|
|
|
|
|
package fs
|
|
|
|
|
2017-05-10 17:48:22 +00:00
|
|
|
import (
|
|
|
|
"os"
|
2017-07-18 19:47:30 +00:00
|
|
|
"syscall"
|
2017-05-10 17:48:22 +00:00
|
|
|
)
|
2017-04-15 08:53:12 +00:00
|
|
|
|
|
|
|
// fixpath returns an absolute path on windows, so restic can open long file
|
|
|
|
// names.
|
|
|
|
func fixpath(name string) string {
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
2017-05-10 17:48:22 +00:00
|
|
|
// TempFile creates a temporary file which has already been deleted (on
|
|
|
|
// supported platforms)
|
|
|
|
func TempFile(dir, prefix string) (f *os.File, err error) {
|
2022-12-02 18:36:43 +00:00
|
|
|
f, err = os.CreateTemp(dir, prefix)
|
2017-05-10 17:48:22 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err = os.Remove(f.Name()); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return f, nil
|
|
|
|
}
|
2017-07-18 19:47:30 +00:00
|
|
|
|
2024-07-01 22:45:59 +00:00
|
|
|
// isNotSupported returns true if the error is caused by an unsupported file system feature.
|
2017-07-18 19:47:30 +00:00
|
|
|
func isNotSupported(err error) bool {
|
|
|
|
if perr, ok := err.(*os.PathError); ok && perr.Err == syscall.ENOTSUP {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// Chmod changes the mode of the named file to mode.
|
|
|
|
func Chmod(name string, mode os.FileMode) error {
|
|
|
|
err := os.Chmod(fixpath(name), mode)
|
|
|
|
|
|
|
|
// ignore the error if the FS does not support setting this mode (e.g. CIFS with gvfs on Linux)
|
|
|
|
if err != nil && isNotSupported(err) {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|