فهرست منبع

+ implemented environment variables support in the DOS unit for the WASI target

git-svn-id: trunk@49551 -
nickysn 4 سال پیش
والد
کامیت
afb9c2ae94
2فایلهای تغییر یافته به همراه61 افزوده شده و 24 حذف شده
  1. 35 23
      rtl/wasi/dos.pp
  2. 26 1
      rtl/wasi/system.pp

+ 35 - 23
rtl/wasi/dos.pp

@@ -721,54 +721,66 @@ End;
 ******************************************************************************}
 
 Function EnvCount: Longint;
-{var
+var
   envcnt : longint;
-  p      : ppchar;}
+  p      : ppchar;
 Begin
-(*  envcnt:=0;
-  p:=envp;      {defined in syslinux}
-  while (p^<>nil) do
-   begin
-     inc(envcnt);
-     inc(p);
-   end;
-  EnvCount := envcnt*)
+  envcnt:=0;
+  p:=envp;      {defined in system}
+  if p<>nil then
+    while p^<>nil do
+      begin
+        inc(envcnt);
+        inc(p);
+      end;
+  EnvCount := envcnt
 End;
 
 
 Function EnvStr (Index: longint): String;
-{Var
+Var
   i : longint;
-  p : ppchar;}
+  p : ppchar;
 Begin
-(*  if Index <= 0 then
+  if (Index <= 0) or (envp=nil) then
     envstr:=''
   else
     begin
-      p:=envp;      {defined in syslinux}
+      p:=envp;      {defined in system}
       i:=1;
       while (i<Index) and (p^<>nil) do
         begin
           inc(i);
           inc(p);
         end;
-      if p=nil then
+      if p^=nil then
         envstr:=''
       else
         envstr:=strpas(p^)
-    end;*)
+    end;
 end;
 
 
 Function GetEnv(EnvVar: String): String;
-{var
-  p     : pchar;}
+var
+  hp : ppchar;
+  hs : string;
+  eqpos : longint;
 Begin
-{  p:=BaseUnix.fpGetEnv(EnvVar);
-  if p=nil then
-   GetEnv:=''
-  else
-   GetEnv:=StrPas(p);}
+  getenv:='';
+  hp:=envp;
+  if hp<>nil then
+    while assigned(hp^) do
+      begin
+        hs:=strpas(hp^);
+        eqpos:=pos('=',hs);
+        if copy(hs,1,eqpos-1)=envvar then
+          begin
+            getenv:=copy(hs,eqpos+1,length(hs)-eqpos);
+            break;
+          end;
+        inc(hp);
+      end;
 End;
 
 

+ 26 - 1
rtl/wasi/system.pp

@@ -51,6 +51,7 @@ const
 var
   argc: longint;
   argv: PPChar;
+  envp: PPChar;
   preopened_dirs_count: longint;
   preopened_dirs: PPChar;
   drives_count: longint;
@@ -79,6 +80,8 @@ var
   argv_size,
   argv_buf_size: __wasi_size_t;
   argv_buf: Pointer;
+  environc,environ_buf_size,envp_size: __wasi_size_t;
+  environ_buf: Pointer;
 
 function GetProcessID: SizeUInt;
 begin
@@ -239,6 +242,27 @@ begin
     Inc(current_drive);
 end;
 
+procedure Setup_Environment;
+begin
+  if envp<>nil then
+    exit;
+  if __wasi_environ_sizes_get(@environc, @environ_buf_size)<>__WASI_ERRNO_SUCCESS then
+  begin
+    envp:=nil;
+    exit;
+  end;
+  envp_size:=(environc+1)*SizeOf(PChar);
+  GetMem(envp, envp_size);
+  GetMem(environ_buf, environ_buf_size);
+  envp[environc]:=nil;
+  if __wasi_environ_get(Pointer(envp), environ_buf)<>__WASI_ERRNO_SUCCESS then
+  begin
+    FreeMem(envp, envp_size);
+    FreeMem(environ_buf, environ_buf_size);
+    envp:=nil;
+  end;
+end;
+
 procedure setup_arguments;
 begin
   if argv<>nil then
@@ -361,5 +385,6 @@ begin
 {$ifdef FPC_HAS_FEATURE_THREADING}
   InitSystemThreads;
 {$endif}
-  Setup_PreopenedDirs
+  Setup_Environment;
+  Setup_PreopenedDirs;
 end.