Browse Source

+ implemented SysUtils.FileOpen for WASI

Nikolay Nikolov 3 years ago
parent
commit
62846f54ad
1 changed files with 67 additions and 0 deletions
  1. 67 0
      rtl/wasi/sysutils.pp

+ 67 - 0
rtl/wasi/sysutils.pp

@@ -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;