Browse Source

* enumerate preopened dirs on startup and store them in a list, accessible via global vars in the system unit

git-svn-id: trunk@49521 -
nickysn 4 years ago
parent
commit
0a384b0905
1 changed files with 14 additions and 8 deletions
  1. 14 8
      rtl/wasi/system.pp

+ 14 - 8
rtl/wasi/system.pp

@@ -51,6 +51,8 @@ const
 var
 var
   argc: longint;
   argc: longint;
   argv: PPChar;
   argv: PPChar;
+  preopened_dirs_count: longint;
+  preopened_dirs: PPChar;
 
 
 procedure DebugWrite(const P: PChar);
 procedure DebugWrite(const P: PChar);
 procedure DebugWriteLn(const P: PChar);
 procedure DebugWriteLn(const P: PChar);
@@ -92,6 +94,8 @@ var
   res: __wasi_errno_t;
   res: __wasi_errno_t;
   prestat_dir_name: PChar;
   prestat_dir_name: PChar;
 begin
 begin
+  preopened_dirs_count:=0;
+  preopened_dirs:=nil;
   fd:=3;
   fd:=3;
   repeat
   repeat
     res:=__wasi_fd_prestat_get(fd, @prestat);
     res:=__wasi_fd_prestat_get(fd, @prestat);
@@ -99,14 +103,16 @@ begin
     begin
     begin
       if (prestat.tag=__WASI_PREOPENTYPE_DIR) and (prestat.u.dir.pr_name_len>0) then
       if (prestat.tag=__WASI_PREOPENTYPE_DIR) and (prestat.u.dir.pr_name_len>0) then
       begin
       begin
-        //GetMem(prestat_dir_name,prestat.u.dir.pr_name_len+1);
-        //if __wasi_fd_prestat_dir_name(fd,PByte(prestat_dir_name),prestat.u.dir.pr_name_len)=__WASI_ERRNO_SUCCESS then
-        //begin
-        //  prestat_dir_name[prestat.u.dir.pr_name_len]:=#0;
-        //  //Writeln(prestat_dir_name);
-        //end
-        //else
-        //  FreeMem(prestat_dir_name,prestat.u.dir.pr_name_len+1);
+        GetMem(prestat_dir_name,prestat.u.dir.pr_name_len+1);
+        if __wasi_fd_prestat_dir_name(fd,PByte(prestat_dir_name),prestat.u.dir.pr_name_len)=__WASI_ERRNO_SUCCESS then
+        begin
+          prestat_dir_name[prestat.u.dir.pr_name_len]:=#0;
+          Inc(preopened_dirs_count);
+          ReAllocMem(preopened_dirs, preopened_dirs_count*SizeOf(PChar));
+          preopened_dirs[preopened_dirs_count-1]:=prestat_dir_name;
+        end
+        else
+          FreeMem(prestat_dir_name,prestat.u.dir.pr_name_len+1);
       end;
       end;
     end;
     end;
     Inc(fd);
     Inc(fd);