@@ -386,16 +386,30 @@ open class Process: NSObject {
386
386
387
387
var siStartupInfo : STARTUPINFOW = STARTUPINFOW ( )
388
388
siStartupInfo. cb = DWORD ( MemoryLayout< STARTUPINFOW> . size)
389
+ siStartupInfo. dwFlags = DWORD ( STARTF_USESTDHANDLES)
389
390
390
391
var _devNull : FileHandle ?
391
392
func devNullFd( ) throws -> HANDLE {
392
393
_devNull = try _devNull ?? FileHandle ( forUpdating: URL ( fileURLWithPath: " NUL " , isDirectory: false ) )
393
394
return _devNull!. handle
394
395
}
395
396
397
+ var modifiedPipes : [ ( handle: HANDLE , prevValue: DWORD ) ] = [ ]
398
+ defer { modifiedPipes. forEach { SetHandleInformation ( $0. handle, DWORD ( HANDLE_FLAG_INHERIT) , $0. prevValue) } }
399
+
400
+ func deferReset( handle: HANDLE ) throws {
401
+ var handleInfo : DWORD = 0
402
+ guard GetHandleInformation ( handle, & handleInfo) else {
403
+ throw _NSErrorWithWindowsError ( GetLastError ( ) , reading: false )
404
+ }
405
+ modifiedPipes. append ( ( handle: handle, prevValue: handleInfo & DWORD ( HANDLE_FLAG_INHERIT) ) )
406
+ }
407
+
396
408
switch standardInput {
397
409
case let pipe as Pipe :
398
410
siStartupInfo. hStdInput = pipe. fileHandleForReading. handle
411
+ try deferReset ( handle: pipe. fileHandleForWriting. handle)
412
+ SetHandleInformation ( pipe. fileHandleForWriting. handle, DWORD ( HANDLE_FLAG_INHERIT) , 0 )
399
413
400
414
// nil or NullDevice maps to NUL
401
415
case let handle as FileHandle where handle === FileHandle . _nulldeviceFileHandle: fallthrough
@@ -404,12 +418,16 @@ open class Process: NSObject {
404
418
405
419
case let handle as FileHandle :
406
420
siStartupInfo. hStdInput = handle. handle
421
+ try deferReset ( handle: handle. handle)
422
+ SetHandleInformation ( handle. handle, DWORD ( HANDLE_FLAG_INHERIT) , 1 )
407
423
default : break
408
424
}
409
425
410
426
switch standardOutput {
411
427
case let pipe as Pipe :
412
428
siStartupInfo. hStdOutput = pipe. fileHandleForWriting. handle
429
+ try deferReset ( handle: pipe. fileHandleForReading. handle)
430
+ SetHandleInformation ( pipe. fileHandleForReading. handle, DWORD ( HANDLE_FLAG_INHERIT) , 0 )
413
431
414
432
// nil or NullDevice maps to NUL
415
433
case let handle as FileHandle where handle === FileHandle . _nulldeviceFileHandle: fallthrough
@@ -418,12 +436,16 @@ open class Process: NSObject {
418
436
419
437
case let handle as FileHandle :
420
438
siStartupInfo. hStdOutput = handle. handle
439
+ try deferReset ( handle: handle. handle)
440
+ SetHandleInformation ( handle. handle, DWORD ( HANDLE_FLAG_INHERIT) , 1 )
421
441
default : break
422
442
}
423
443
424
444
switch standardError {
425
445
case let pipe as Pipe :
426
446
siStartupInfo. hStdError = pipe. fileHandleForWriting. handle
447
+ try deferReset ( handle: pipe. fileHandleForReading. handle)
448
+ SetHandleInformation ( pipe. fileHandleForReading. handle, DWORD ( HANDLE_FLAG_INHERIT) , 0 )
427
449
428
450
// nil or NullDevice maps to NUL
429
451
case let handle as FileHandle where handle === FileHandle . _nulldeviceFileHandle: fallthrough
@@ -432,6 +454,8 @@ open class Process: NSObject {
432
454
433
455
case let handle as FileHandle :
434
456
siStartupInfo. hStdError = handle. handle
457
+ try deferReset ( handle: handle. handle)
458
+ SetHandleInformation ( handle. handle, DWORD ( HANDLE_FLAG_INHERIT) , 1 )
435
459
default : break
436
460
}
437
461
0 commit comments