diff --git a/tests/conn_test.go b/tests/conn_test.go index 0ab2405..53a8922 100644 --- a/tests/conn_test.go +++ b/tests/conn_test.go @@ -295,6 +295,17 @@ func TestConn_Filename(t *testing.T) { t.Parallel() file := filepath.Join(t.TempDir(), "test.db") + f, err := os.Create(file) + if err != nil { + t.Fatal(err) + } + f.Close() + + file, err = filepath.EvalSymlinks(file) + if err != nil { + t.Fatal(err) + } + db, err := sqlite3.Open(file) if err != nil { t.Fatal(err) diff --git a/vfs/file.go b/vfs/file.go index 6540982..8e65ca6 100644 --- a/vfs/file.go +++ b/vfs/file.go @@ -13,22 +13,28 @@ import ( type vfsOS struct{} func (vfsOS) FullPathname(path string) (string, error) { - path, err := filepath.Abs(path) + link, err := evalSymlinks(path) if err != nil { return "", err } - return path, testSymlinks(filepath.Dir(path)) + full, err := filepath.Abs(link) + if err == nil && link != path { + err = _OK_SYMLINK + } + return full, err } -func testSymlinks(path string) error { - p, err := filepath.EvalSymlinks(path) +func evalSymlinks(path string) (string, error) { + var file string + _, err := os.Lstat(path) + if errors.Is(err, fs.ErrNotExist) { + path, file = filepath.Split(path) + } + path, err = filepath.EvalSymlinks(path) if err != nil { - return err + return "", err } - if p != path { - return _OK_SYMLINK - } - return nil + return filepath.Join(path, file), nil } func (vfsOS) Delete(path string, syncDir bool) error {