From d08636bdad4f36431bfdf07e8400d7188a2df781 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Fri, 25 Oct 2024 11:32:12 +0200 Subject: Rework file copy/open-read-write-close data handling Stick to the POSIX open(2), read(2), write(2), close(2) return values semantics, apply on the VFS interface. Also handle short reads and writes that are common for some gvfs backends. This makes cross-VFS copy work. --- ULibc.pas | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) (limited to 'ULibc.pas') diff --git a/ULibc.pas b/ULibc.pas index edccfc8..3b187be 100644 --- a/ULibc.pas +++ b/ULibc.pas @@ -630,6 +630,23 @@ const SEEK_CUR = 1; SEEK_END = 2; +const + O_RDONLY = 0; + O_WRONLY = 1; + O_RDWR = 2; + O_CREAT = $40; + O_EXCL = $80; + O_NOCTTY = $100; + O_TRUNC = $200; + O_APPEND = $400; + O_NONBLOCK = $800; + O_NDELAY = O_NONBLOCK; + O_SYNC = $1000; + O_DIRECT = $4000; + O_DIRECTORY = $10000; + O_NOFOLLOW = $20000; + O_CLOEXEC = $80000; + const _STAT_VER_LINUX_OLD = 1; _STAT_VER_KERNEL = 1; @@ -872,15 +889,17 @@ function feof(stream: PFILE): Longint; cdecl; external GLIBC_LIB name 'feof'; function ferror(stream: PFILE): Longint; cdecl; external GLIBC_LIB name 'ferror'; function fcntl(fd: Longint; cmd: Longint): Longint; cdecl; varargs; external GLIBC_LIB name 'fcntl'; -function open(const pathname: PChar; flags: Longint): Longint; cdecl; varargs; external GLIBC_LIB name 'open'; -function open64(const pathname: PChar; flags: Longint): Longint; cdecl; varargs; external GLIBC_LIB name 'open64'; +function open(const pathname: PChar; flags: Longint; mode: Longint): Longint; cdecl; varargs; external GLIBC_LIB name 'open'; +function open64(const pathname: PChar; flags: Longint; mode: Longint): Longint; cdecl; varargs; external GLIBC_LIB name 'open64'; function creat(const pathname: PChar; mode: __mode_t): Longint; cdecl; external GLIBC_LIB name 'creat'; function creat64(const pathname: PChar; mode: __mode_t): Longint; cdecl; external GLIBC_LIB name 'creat64'; +function lseek(fd: longint; offset: __off_t; whence: longint):__off_t; cdecl; external GLIBC_LIB name 'lseek'; +function lseek64(fd: longint; offset: __off64_t; whence: longint):__off64_t; cdecl; external GLIBC_LIB name 'lseek64'; -function __read(Handle: Integer; var Buffer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'read'; -function libc_read(Handle: Integer; var Buffer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'read'; -function __write(Handle: Integer; const Buffer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'write'; -function libc_write(Handle: Integer; const Buffer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'write'; +function __read(Handle: Integer; Buffer: Pointer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'read'; +function libc_read(Handle: Integer; Buffer: Pointer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'read'; +function __write(Handle: Integer; Buffer: Pointer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'write'; +function libc_write(Handle: Integer; Buffer: Pointer; Count: size_t): ssize_t; cdecl; external GLIBC_LIB name 'write'; function __close(Handle: Integer): Integer; cdecl; external GLIBC_LIB name 'close'; function libc_close(Handle: Integer): Integer; cdecl; external GLIBC_LIB name 'close'; -- cgit v1.2.3