+ Added assignstream with rerouting of stderr, by Sebastian Guenther

This commit is contained in:
michael 1999-07-29 15:53:55 +00:00
parent 771996a9db
commit caa6ed2597

View File

@ -594,6 +594,7 @@ Procedure POpen(var F:file;const Prog:String;rw:char);
Function mkFifo(pathname:string;mode:longint):boolean;
Procedure AssignStream(Var StreamIn,Streamout:text;Const Prog:String);
procedure AssignStream(var StreamIn, StreamOut, StreamErr: Text; const prog: String);
{**************************
General information
@ -2434,6 +2435,99 @@ begin
end;
end;
procedure AssignStream(var StreamIn, StreamOut, StreamErr: Text; const prog: String);
{
Starts the program in 'prog' and makes its input, output and error output the
other end of three pipes, which are the stdin, stdout and stderr of a program
specified in 'prog'.
StreamOut can be used to write to the program, StreamIn can be used to read
the output of the program, StreamErr reads the error output of the program.
See the following diagram :
Parent Child
StreamOut --> StdIn (input)
StreamIn <-- StdOut (output)
StreamErr <-- StdErr (error output)
}
var
PipeIn, PipeOut, PipeErr: text;
pid: LongInt;
pl: ^LongInt;
begin
LinuxError := 0;
// Assign pipes
AssignPipe(StreamIn, PipeOut);
if LinuxError <> 0 then exit;
AssignPipe(StreamErr, PipeErr);
if LinuxError <> 0 then begin
Close(StreamIn);
Close(PipeOut);
exit;
end;
AssignPipe(PipeIn, StreamOut);
if LinuxError <> 0 then begin
Close(StreamIn);
Close(PipeOut);
Close(StreamErr);
Close(PipeErr);
exit;
end;
// Fork
pid := Fork;
if LinuxError <> 0 then begin
Close(StreamIn);
Close(PipeOut);
Close(StreamErr);
Close(PipeErr);
Close(PipeIn);
Close(StreamOut);
exit;
end;
if pid = 0 then begin
// *** We are in the child ***
// Close what we don not need
Close(StreamOut);
Close(StreamIn);
Close(StreamErr);
// Connect pipes
dup2(PipeIn, Input);
if LinuxError <> 0 then Halt(127);
Close(PipeIn);
dup2(PipeOut, Output);
if LinuxError <> 0 then Halt(127);
Close(PipeOut);
dup2(PipeErr, StdErr);
if LinuxError <> 0 then Halt(127);
Close(PipeErr);
// Execute program
Execl(Prog);
Halt(127);
end else begin
// *** We are in the parent ***
Close(PipeErr);
Close(PipeOut);
Close(PipeIn);
// Save the process ID - needed when closing
pl := @(TextRec(StreamIn).userdata[2]);
pl^ := pid;
TextRec(StreamIn).closefunc := @PCloseText;
// Save the process ID - needed when closing
pl := @(TextRec(StreamOut).userdata[2]);
pl^ := pid;
TextRec(StreamOut).closefunc := @PCloseText;
// Save the process ID - needed when closing
pl := @(TextRec(StreamErr).userdata[2]);
pl^ := pid;
TextRec(StreamErr).closefunc := @PCloseText;
LinuxError := 0;
end;
end;
{******************************************************************************
General information calls
@ -3646,7 +3740,10 @@ End.
{
$Log$
Revision 1.40 1999-07-15 20:00:31 michael
Revision 1.41 1999-07-29 15:53:55 michael
+ Added assignstream with rerouting of stderr, by Sebastian Guenther
Revision 1.40 1999/07/15 20:00:31 michael
+ Added ansistring version of shell()
Revision 1.39 1999/05/30 11:37:27 peter