diff --git a/rtl/wasi/sysutils.pp b/rtl/wasi/sysutils.pp index 009626e36f..f558c09d87 100644 --- a/rtl/wasi/sysutils.pp +++ b/rtl/wasi/sysutils.pp @@ -144,17 +144,61 @@ end; Function FileCreate (Const FileName : RawByteString) : THandle; -begin +Const + fs_rights_base: __wasi_rights_t = + __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; +Var + SystemFileName: RawByteString; + ourfd: __wasi_fd_t; + res: __wasi_errno_t; + pr: RawByteString; + fd: __wasi_fd_t; +Begin + SystemFileName:=ToSingleByteFileSystemEncodedFileName(FileName); + if not ConvertToFdRelativePath(SystemFileName,fd,pr) then + begin + result:=-1; + exit; + end; + repeat + res:=__wasi_path_open(fd, + 0, + PChar(pr), + length(pr), + __WASI_OFLAGS_CREAT or __WASI_OFLAGS_TRUNC, + fs_rights_base, + fs_rights_base, + 0, + @ourfd); + until (res=__WASI_ERRNO_SUCCESS) or (res<>__WASI_ERRNO_INTR); + If res=__WASI_ERRNO_SUCCESS Then + Result:=ourfd + else + Result:=-1; end; Function FileCreate (Const FileName : RawByteString; ShareMode:integer; Rights : integer) : THandle; begin + FileCreate:=FileCreate(FileName); end; Function FileCreate (Const FileName : RawByteString; Rights:integer) : THandle; begin + FileCreate:=FileCreate(FileName); end;