unit xplatformutils;
{$I jedi-sdl.inc}
interface
uses
{$IFDEF WIN32}
Windows;
{$ELSE}
{$IFDEF UNIX}
{$IFDEF FPC}
libc;
{$ELSE}
Libc,
Xlib;
{$ENDIF}
{$ENDIF}
{$ENDIF}
const
{$IFDEF MACOS}
DIR_SEP = ':';
DIR_CUR = ':';
{$ELSE}
{$IFDEF DARWIN}
DIR_SEP = ':';
DIR_CUR = ':';
{$ELSE}
{$IFDEF WIN32}
DIR_SEP = '\';
DIR_CUR = '';
{$ELSE}
DIR_SEP = '/';
DIR_CUR = '';
{$ENDIF}
{$ENDIF}
{$ENDIF}
procedure ExecAndWait( aProcess : string; aArguments : array of string );
implementation
procedure ExecAndWait( aProcess : string; aArguments : array of string );
var
{$IFDEF WIN32}
CommandLine : string;
ProcessInfo: TProcessInformation;
Startupinfo: TStartupInfo;
ExitCode: longword;
x : integer;
{$ELSE}
{$IFDEF UNIX}
pid: PID_T;
Max: Integer;
i: Integer;
parg: PPCharArray;
argnum: Integer;
returnvalue : Integer;
{$ENDIF}
{$ENDIF}
begin
{$IFDEF WIN32}
// Initialize the structures
FillChar(ProcessInfo, sizeof(TProcessInformation), 0);
FillChar(Startupinfo, sizeof(TStartupInfo), 0);
Startupinfo.cb := sizeof(TStartupInfo);
// Attempts to create the process
Startupinfo.dwFlags := STARTF_USESHOWWINDOW;
Startupinfo.wShowWindow := 1;
CommandLine := aProcess;
for x := Low(aArguments ) to High(aArguments ) do
CommandLine := CommandLine + ' ' + aArguments[ x ];
if CreateProcess( nil, PChar( CommandLine ), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, Startupinfo, ProcessInfo ) then
begin
// The process has been successfully created
// No let's wait till it ends...
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
// Process has finished. Now we should close it.
GetExitCodeProcess(ProcessInfo.hProcess, ExitCode); // Optional
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
{$ELSE}
{$IFDEF UNIX}
pid := fork;
if pid = 0 then
begin
Max := sysconf(_SC_OPEN_MAX);
for i := (STDERR_FILENO+1) to Max do
begin
fcntl(i, F_SETFD, FD_CLOEXEC);
end;
argnum := High(aArguments) + 1;
GetMem(parg,(2 + argnum) * sizeof(PChar));
parg[0] := PChar(aProcess);
i := 0;
while i <= high(aArguments) do
begin
inc(i);
parg[i] := PChar(aArguments[i-1]);
end;
parg[i+1] := nil;
execvp(PChar(aProcess),PPChar(@parg[0]));
halt;
end;
if pid > 0 then
begin
waitpid(pid,@returnvalue,0);
end;
{$ENDIF}
{$ENDIF}
end;
end.