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

git-svn-id: trunk@49551 -
This commit is contained in:
nickysn 2021-06-23 23:15:15 +00:00
parent c275c3c7f2
commit afb9c2ae94
2 changed files with 61 additions and 24 deletions

View File

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

View File

@ -51,6 +51,7 @@ const
var var
argc: longint; argc: longint;
argv: PPChar; argv: PPChar;
envp: PPChar;
preopened_dirs_count: longint; preopened_dirs_count: longint;
preopened_dirs: PPChar; preopened_dirs: PPChar;
drives_count: longint; drives_count: longint;
@ -79,6 +80,8 @@ var
argv_size, argv_size,
argv_buf_size: __wasi_size_t; argv_buf_size: __wasi_size_t;
argv_buf: Pointer; argv_buf: Pointer;
environc,environ_buf_size,envp_size: __wasi_size_t;
environ_buf: Pointer;
function GetProcessID: SizeUInt; function GetProcessID: SizeUInt;
begin begin
@ -239,6 +242,27 @@ begin
Inc(current_drive); Inc(current_drive);
end; 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; procedure setup_arguments;
begin begin
if argv<>nil then if argv<>nil then
@ -361,5 +385,6 @@ begin
{$ifdef FPC_HAS_FEATURE_THREADING} {$ifdef FPC_HAS_FEATURE_THREADING}
InitSystemThreads; InitSystemThreads;
{$endif} {$endif}
Setup_PreopenedDirs Setup_Environment;
Setup_PreopenedDirs;
end. end.