photoprism/pkg/fs/symlink.go

40 lines
981 B
Go

package fs
import (
"os"
"path/filepath"
"github.com/google/uuid"
)
// SymlinksSupported tests if a storage path supports symlinks.
func SymlinksSupported(storagePath string) (bool, error) {
linkName := filepath.Join(storagePath, uuid.NewString()+"-link.tmp")
targetName := filepath.Join(storagePath, uuid.NewString()+".tmp")
// Delete files after test.
defer func(link, target string) {
_ = os.Remove(link)
_ = os.Remove(target)
}(linkName, targetName)
// Create empty test target file.
if targetFile, err := os.OpenFile(targetName, os.O_RDONLY|os.O_CREATE, ModeFile); err != nil {
return false, err
} else if err = targetFile.Close(); err != nil {
return false, err
}
// Create test link.
if err := os.Symlink(filepath.Base(targetName), linkName); err != nil {
return false, err
}
// Resolve and compare test target.
if linkTarget, err := Resolve(linkName); err != nil {
return false, err
} else {
return linkTarget == targetName, nil
}
}