diff --git a/vfs.go b/vfs.go index ecdb898..35931f4 100644 --- a/vfs.go +++ b/vfs.go @@ -314,7 +314,25 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl case _FCNTL_SIZE_HINT: // case _FCNTL_HAS_MOVED: - // + return vfsFileMoved(ctx, mod, pFile, pArg) } return uint32(NOTFOUND) } + +func vfsFileMoved(ctx context.Context, mod api.Module, pFile, pResOut uint32) uint32 { + file := vfsFile.GetOS(ctx, mod, pFile) + fi, err := file.Stat() + if err != nil { + return uint32(IOERR_FSTAT) + } + pi, err := os.Stat(file.Name()) + if err != nil && !errors.Is(err, fs.ErrNotExist) { + return uint32(IOERR_FSTAT) + } + var res uint32 + if !os.SameFile(fi, pi) { + res = 1 + } + memory{mod}.writeUint32(pResOut, res) + return _OK +} diff --git a/vfs_lock.go b/vfs_lock.go index 354b6c4..7648a6e 100644 --- a/vfs_lock.go +++ b/vfs_lock.go @@ -56,7 +56,7 @@ const ( type vfsLockState uint32 func vfsLock(ctx context.Context, mod api.Module, pFile uint32, eLock vfsLockState) uint32 { - // Argument check. SQLite never explicitly requests a pendig lock. + // Argument check. SQLite never explicitly requests a pending lock. if eLock != _SHARED_LOCK && eLock != _RESERVED_LOCK && eLock != _EXCLUSIVE_LOCK { panic(assertErr()) }