@@ -331,11 +331,8 @@ public final class Process: ObjectIdentifierProtocol {
331
331
}
332
332
}
333
333
334
- /// Launch the subprocess. Returns a WritableByteStream object that can be used to communicate to the process's
335
- /// stdin. If needed, the stream can be closed using the close() API. Otherwise, the stream will be closed
336
- /// automatically.
337
- @discardableResult
338
- public func launch( ) throws -> WritableByteStream {
334
+ /// Launch the subprocess.
335
+ public func launch( ) throws {
339
336
precondition ( arguments. count > 0 && !arguments[ 0 ] . isEmpty, " Need at least one argument to launch the process. " )
340
337
precondition ( !launched, " It is not allowed to launch the same process object again. " )
341
338
@@ -354,15 +351,12 @@ public final class Process: ObjectIdentifierProtocol {
354
351
throw Process . Error. missingExecutableProgram ( program: executable)
355
352
}
356
353
357
- #if os(Windows)
354
+ #if os(Windows)
358
355
_process = Foundation . Process ( )
359
356
_process? . arguments = Array ( arguments. dropFirst ( ) ) // Avoid including the executable URL twice.
360
357
_process? . executableURL = executablePath. asURL
361
358
_process? . environment = environment
362
359
363
- let stdinPipe = Pipe ( )
364
- _process? . standardInput = stdinPipe
365
-
366
360
if outputRedirection. redirectsOutput {
367
361
let stdoutPipe = Pipe ( )
368
362
let stderrPipe = Pipe ( )
@@ -385,8 +379,6 @@ public final class Process: ObjectIdentifierProtocol {
385
379
}
386
380
387
381
try _process? . run ( )
388
-
389
- return stdinPipe. fileHandleForWriting
390
382
#else
391
383
// Initialize the spawn attributes.
392
384
#if canImport(Darwin) || os(Android)
@@ -461,17 +453,14 @@ public final class Process: ObjectIdentifierProtocol {
461
453
#endif
462
454
}
463
455
464
- var stdinPipe : [ Int32 ] = [ - 1 , - 1 ]
465
- try open ( pipe: & stdinPipe)
466
-
467
- let stdinStream = try LocalFileOutputByteStream ( filePointer: fdopen ( stdinPipe [ 1 ] , " wb " ) , closeOnDeinit: true )
468
-
469
- // Dupe the read portion of the remote to 0.
470
- posix_spawn_file_actions_adddup2 ( & fileActions, stdinPipe [ 0 ] , 0 )
471
-
472
- // Close the other side's pipe since it was dupped to 0.
473
- posix_spawn_file_actions_addclose ( & fileActions, stdinPipe [ 0 ] )
474
- posix_spawn_file_actions_addclose ( & fileActions, stdinPipe [ 1 ] )
456
+ // Workaround for https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=89e435f3559c53084498e9baad22172b64429362
457
+ // Change allowing for newer version of glibc
458
+ guard let devNull = strdup ( " /dev/null " ) else {
459
+ throw SystemError . posix_spawn ( 0 , arguments)
460
+ }
461
+ defer { free ( devNull) }
462
+ // Open /dev/null as stdin.
463
+ posix_spawn_file_actions_addopen ( & fileActions, 0 , devNull, O_RDONLY, 0 )
475
464
476
465
var outputPipe : [ Int32 ] = [ - 1 , - 1 ]
477
466
var stderrPipe : [ Int32 ] = [ - 1 , - 1 ]
@@ -482,7 +471,7 @@ public final class Process: ObjectIdentifierProtocol {
482
471
// Open the write end of the pipe.
483
472
posix_spawn_file_actions_adddup2 ( & fileActions, outputPipe [ 1 ] , 1 )
484
473
485
- // Close the other ends of the pipe since they were dupped to 1 .
474
+ // Close the other ends of the pipe.
486
475
posix_spawn_file_actions_addclose ( & fileActions, outputPipe [ 0 ] )
487
476
posix_spawn_file_actions_addclose ( & fileActions, outputPipe [ 1 ] )
488
477
@@ -494,7 +483,7 @@ public final class Process: ObjectIdentifierProtocol {
494
483
try open ( pipe: & stderrPipe)
495
484
posix_spawn_file_actions_adddup2 ( & fileActions, stderrPipe [ 1 ] , 2 )
496
485
497
- // Close the other ends of the pipe since they were dupped to 2 .
486
+ // Close the other ends of the pipe.
498
487
posix_spawn_file_actions_addclose ( & fileActions, stderrPipe [ 0 ] )
499
488
posix_spawn_file_actions_addclose ( & fileActions, stderrPipe [ 1 ] )
500
489
}
@@ -511,14 +500,11 @@ public final class Process: ObjectIdentifierProtocol {
511
500
throw SystemError . posix_spawn ( rv, arguments)
512
501
}
513
502
514
- // Close the local read end of the input pipe.
515
- try close ( fd: stdinPipe [ 0 ] )
516
-
517
503
if outputRedirection. redirectsOutput {
518
504
let outputClosures = outputRedirection. outputClosures
519
505
520
- // Close the local write end of the output pipe.
521
- try close ( fd: outputPipe [ 1 ] )
506
+ // Close the write end of the output pipe.
507
+ try close ( fd: & outputPipe[ 1 ] )
522
508
523
509
// Create a thread and start reading the output on it.
524
510
var thread = Thread { [ weak self] in
@@ -531,8 +517,8 @@ public final class Process: ObjectIdentifierProtocol {
531
517
532
518
// Only schedule a thread for stderr if no redirect was requested.
533
519
if !outputRedirection. redirectStderr {
534
- // Close the local write end of the stderr pipe.
535
- try close ( fd: stderrPipe [ 1 ] )
520
+ // Close the write end of the stderr pipe.
521
+ try close ( fd: & stderrPipe[ 1 ] )
536
522
537
523
// Create a thread and start reading the stderr output on it.
538
524
thread = Thread { [ weak self] in
@@ -544,8 +530,6 @@ public final class Process: ObjectIdentifierProtocol {
544
530
self . stderr. thread = thread
545
531
}
546
532
}
547
-
548
- return stdinStream
549
533
#endif // POSIX implementation
550
534
}
551
535
@@ -747,15 +731,11 @@ private func open(pipe: inout [Int32]) throws {
747
731
}
748
732
749
733
/// Close the given fd.
750
- private func close( fd: Int32 ) throws {
751
- func innerClose( _ fd: inout Int32 ) throws {
752
- let rv = TSCLibc . close ( fd)
753
- guard rv == 0 else {
754
- throw SystemError . close ( rv)
755
- }
734
+ private func close( fd: inout Int32 ) throws {
735
+ let rv = TSCLibc . close ( fd)
736
+ guard rv == 0 else {
737
+ throw SystemError . close ( rv)
756
738
}
757
- var innerFd = fd
758
- try innerClose ( & innerFd)
759
739
}
760
740
761
741
extension Process . Error : CustomStringConvertible {
@@ -808,27 +788,3 @@ extension ProcessResult.Error: CustomStringConvertible {
808
788
}
809
789
}
810
790
}
811
-
812
- #if os(Windows)
813
- extension FileHandle : WritableByteStream {
814
- public var position : Int {
815
- return Int ( offsetInFile)
816
- }
817
-
818
- public func write( _ byte: UInt8 ) {
819
- write ( Data ( [ byte] ) )
820
- }
821
-
822
- public func write< C: Collection > ( _ bytes: C ) where C. Element == UInt8 {
823
- write ( Data ( bytes) )
824
- }
825
-
826
- public func flush( ) {
827
- synchronizeFile ( )
828
- }
829
-
830
- public func close( ) throws {
831
- closeFile ( )
832
- }
833
- }
834
- #endif
0 commit comments