mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-10 20:49:23 +02:00
+ Added assignstream with rerouting of stderr, by Sebastian Guenther
This commit is contained in:
parent
771996a9db
commit
caa6ed2597
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user