On Thu, 19 May 2011, Anton Shepelev wrote:

Ludo Brands:

You can file a bug at http://bugs.freepascal.org/.

This is bug #0019325.

...
I thought about writing a patch, but it seems that it is not
enough to modify the implementation of the  Windows-specific
pipes.inc.

The correct way to create pipes for the three channels (out,
in and err) on Windows is to create non-inheritable  handles
and  duplicate  only  the  child process's ends of them into
inheritable ones, which  means  that  the  CreatePipeHandles
function  must accept a third parameter indicating which end
should be inherited: for OUT and ERR channels it will be the
write-end and for IN -- the read-end.

Here is a possible implementation:

{--------------- changes to pipes.inc -----------------}
Interface
  {...}
  type
     TDupOpt  = (dupIn, dupOut);
     TDupOpts = Set of TDupOpt;

Implemenation
  {...}
  function DuplicateHandleFP(var handle: THandle): Boolean;
  var
     oldHandle: THandle;
  begin
     oldHandle := handle;
     Result := DuplicateHandle
     (  GetCurrentProcess(),
        oldHandle,
        GetCurrentProcess(),
        @handle,
        0,
        true,
        DUPLICATE_SAME_ACCESS
     );
     if Result then
        Result := CloseHandle(oldHandle);
  end;

  Function CreatePipeHandles
  (Var Inhandle,OutHandle : THandle; DupOpts: TDupOpts) : Boolean;
  begin
     Result := CreatePipe (Inhandle,OutHandle,@piNonInheritablePipe,0);
     if Result and (dupIn in DupOpts) then
        Result := DuplicateHandleFP(Inhandle);
     if Result and (dupOut in DupOpts) then
        Result := DuplicateHandleFP(OutHandle);
  end;

  {----------- process.inc -------------------------}
  {CreatePipes will have these calls:}
  begin
    CreatePipeHandles(SI.hStdInput ,HI, [dupIn ]);
    CreatePipeHandles(HO,Si.hStdOutput, [dupOut]);
    if CE then
      CreatePipeHandles(HE,SI.hStdError, [dupOut])
  {...}

Unfortunately,  the third parameter will have to be added to
this  function  in  all  other  platform-specific  pipes.inc
files, but these will just ignore it and work as before.

If  it is preferable to keep the interface of the pipes unit
unchanged, the windows-specific part could just be chaged to
create  non-inheritable  pipes, and the duplication could be
moved into the windows-specific process.inc.

Will you accept one of such patches?

Yes.

The interface of the pipes unit can be changed with a parameter with a default value, so existing code continues to work.

Michael.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to