+ implemented SysUtils.FileOpen for WASI

This commit is contained in:
Nikolay Nikolov 2021-10-11 10:11:07 +03:00
parent aa4070ca8a
commit 62846f54ad

View File

@ -72,7 +72,74 @@ end;
Function FileOpen (Const FileName : RawByteString; Mode : Integer) : THandle;
Var
SystemFileName: RawByteString;
oflags : __wasi_oflags_t = 0;
fs_rights_base: __wasi_rights_t = 0;
fdflags: __wasi_fdflags_t = 0;
ourfd: __wasi_fd_t;
res: __wasi_errno_t;
pr: RawByteString;
fd: __wasi_fd_t;
Begin
SystemFileName:=ToSingleByteFileSystemEncodedFileName(FileName);
case (Mode and (fmOpenRead or fmOpenWrite or fmOpenReadWrite)) of
fmOpenRead:
fs_rights_base :=__WASI_RIGHTS_FD_READ or
__WASI_RIGHTS_FD_FILESTAT_GET or
__WASI_RIGHTS_FD_SEEK or
__WASI_RIGHTS_FD_TELL or
__WASI_RIGHTS_FD_FDSTAT_SET_FLAGS or
__WASI_RIGHTS_FD_ADVISE or
__WASI_RIGHTS_POLL_FD_READWRITE;
fmOpenWrite:
fs_rights_base :=__WASI_RIGHTS_FD_WRITE or
__WASI_RIGHTS_FD_FILESTAT_GET or
__WASI_RIGHTS_FD_SEEK or
__WASI_RIGHTS_FD_TELL or
__WASI_RIGHTS_FD_FDSTAT_SET_FLAGS or
__WASI_RIGHTS_FD_ADVISE or
__WASI_RIGHTS_POLL_FD_READWRITE or
__WASI_RIGHTS_FD_FILESTAT_SET_SIZE or
__WASI_RIGHTS_FD_FILESTAT_SET_TIMES or
__WASI_RIGHTS_FD_ALLOCATE or
__WASI_RIGHTS_FD_DATASYNC or
__WASI_RIGHTS_FD_SYNC;
fmOpenReadWrite:
fs_rights_base :=__WASI_RIGHTS_FD_READ or
__WASI_RIGHTS_FD_WRITE or
__WASI_RIGHTS_FD_FILESTAT_GET or
__WASI_RIGHTS_FD_SEEK or
__WASI_RIGHTS_FD_TELL or
__WASI_RIGHTS_FD_FDSTAT_SET_FLAGS or
__WASI_RIGHTS_FD_ADVISE or
__WASI_RIGHTS_POLL_FD_READWRITE or
__WASI_RIGHTS_FD_FILESTAT_SET_SIZE or
__WASI_RIGHTS_FD_FILESTAT_SET_TIMES or
__WASI_RIGHTS_FD_ALLOCATE or
__WASI_RIGHTS_FD_DATASYNC or
__WASI_RIGHTS_FD_SYNC;
end;
if not ConvertToFdRelativePath(SystemFileName,fd,pr) then
begin
result:=-1;
exit;
end;
repeat
res:=__wasi_path_open(fd,
0,
PChar(pr),
length(pr),
oflags,
fs_rights_base,
fs_rights_base,
fdflags,
@ourfd);
until (res=__WASI_ERRNO_SUCCESS) or (res<>__WASI_ERRNO_INTR);
If res=__WASI_ERRNO_SUCCESS Then
Result:=ourfd
else
Result:=-1;
end;