Browse Source

+ dummy added to keep darwin dir alive

florian 21 years ago
parent
commit
326a427da1
1 changed files with 117 additions and 0 deletions
  1. 117 0
      fcl/darwin/process.inc

+ 117 - 0
fcl/darwin/process.inc

@@ -0,0 +1,117 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1999-2000 by Michael Van Canneyt
+
+    Darwin specific part of TProcess.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+uses
+{$ifdef ver1_0}
+  Linux
+{$else}
+  Unix
+{$endif}
+  ;
+
+Function TProcess.GetRunning : Boolean;
+
+begin
+  IF FRunning then
+    FRunning:=GetExitStatus=-1;
+  Result:=FRunning;
+end;
+
+Procedure TProcess.Execute;
+
+begin
+  FreeStreams;
+  CreatePipeStreams (FChildInputSTream,FParentOutPutStream);
+  CreatePipeStreams (FParentInputStream,FChildOutPutStream);
+  If poUsePipes in FCreateOptions then
+    begin
+    if poStdErrToOutPut in FCreateOptions then
+      CreatePipeStreams (FParentErrorStream,FChildErrorStream)
+    else
+      begin
+      FChildErrorStream:=FChildOutPutStream;
+      FParentErrorStream:=FParentInputStream;
+      end;
+    end
+  else
+    CreatePipeStreams (FParentErrorStream,FChildErrorStream);
+  If FCurrentDirectory<>'' then
+    Chdir(FCurrentDirectory);
+  FHandle:=fork();
+  if FHandle=0 then
+   begin
+   // Child
+   fdClose(0);
+   fdClose(1);
+   fdclose(2);
+   dup2(FChildInputStream.Handle,0);
+   dup2(FCHildOutputStream.Handle,1);
+   dup2(FChildErrorStream.Handle,2);
+   execl(FCommandline);
+   halt(127);
+   end
+  else
+    begin
+    // Parent
+    FPID:=FHandle;
+    FThreadHandle:=FHandle;
+    fdclose(FChildOutputStream.Handle);
+    fdclose(FChildInputStream.Handle);
+    fdclose(FChildErrorStream.Handle);
+    FRunning:=True;
+    if (poWaitOnExit in FCreateOptions) and
+        not (poRunSuspended in FCreateOptions) then
+    WaitOnExit;
+    end;
+end;
+
+Function TProcess.WaitOnExit : Dword;
+
+begin
+  waitpid(FPID, nil, 0);
+{
+  Result:=WaitForSingleObject (FprocessInformation.hProcess,Infinite);
+  If Result<>Wait_Failed then
+    GetExitStatus;
+}  FRunning:=False;
+  Result := 0;
+end;
+
+Function TProcess.Suspend : Longint;
+
+begin
+  Result:=Kill(Handle,SIGSTOP);
+end;
+
+Function TProcess.Resume : LongInt;
+
+begin
+  Result:=Kill(FHandle,SIGCONT);
+end;
+
+Function TProcess.Terminate(AExitCode : Integer) : Boolean;
+
+begin
+  Result:=False;
+  If ExitStatus=-1 then
+    Result:=Kill(FHandle,SIGTERM)=0;
+end;
+
+{
+  $Log$
+  Revision 1.1  2004-02-25 17:06:39  florian
+    + dummy added to keep darwin dir alive
+}