Skip to content

Commit a977945

Browse files
committed
Fix IODescriptor construction from file descriptors on Windows
1 parent 377e202 commit a977945

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

Sources/Subprocess/PipeConfiguration.swift

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,14 @@ private func currentProcessIdentifier() -> ProcessIdentifier {
283283
#endif
284284
}
285285

286+
private func createIODescriptor(from fd: FileDescriptor, closeWhenDone: Bool) -> IODescriptor {
287+
#if canImport(WinSDK)
288+
let errorReadFileDescriptor = IODescriptor(HANDLE(bitPattern: _get_osfhandle(fd.rawValue))!, closeWhenDone: closeWhenDone)
289+
#else
290+
let errorReadFileDescriptor = IODescriptor(fd, closeWhenDone: closeWhenDone)
291+
#endif
292+
}
293+
286294
// MARK: - Internal Functions
287295

288296
extension PipeConfiguration {
@@ -415,7 +423,7 @@ extension PipeConfiguration {
415423
return try await withThrowingTaskGroup(of: CollectedPipeResult.self, returning: CollectedResult<Output, Error>.self) { group in
416424
// Collect error output from all stages
417425
group.addTask {
418-
let errorReadFileDescriptor = IODescriptor(sharedErrorPipe.readEnd, closeWhenDone: true)
426+
let errorReadFileDescriptor = createIODescriptor(from: sharedErrorPipe.readEnd, closeWhenDone: true)
419427
let errorReadEnd = errorReadFileDescriptor.createIOChannel()
420428

421429
let stderr = try await self.error.captureOutput(from: errorReadEnd)
@@ -509,11 +517,11 @@ extension PipeConfiguration {
509517
var inputReadEnd = inputReadFileDescriptor?.createIOChannel()
510518
var inputWriteEnd: IOChannel? = inputWriteFileDescriptor.take()?.createIOChannel()
511519

512-
let outputWriteFileDescriptor = IODescriptor(writeEnd, closeWhenDone: true)
520+
let outputWriteFileDescriptor = createIODescriptor(from: writeEnd, closeWhenDone: true)
513521
var outputWriteEnd: IOChannel? = outputWriteFileDescriptor.createIOChannel()
514522

515523
// Use shared error pipe instead of discarded
516-
let errorWriteFileDescriptor = IODescriptor(sharedErrorPipe.writeEnd, closeWhenDone: false)
524+
let errorWriteFileDescriptor = createIODescriptor(from: sharedErrorPipe.writeEnd, closeWhenDone: false)
517525
var errorWriteEnd: IOChannel? = errorWriteFileDescriptor.createIOChannel()
518526

519527
let result = try await withThrowingTaskGroup(of: Int32.self) { group in
@@ -636,14 +644,14 @@ extension PipeConfiguration {
636644

637645
return taskResult
638646
case .swiftFunction(let function):
639-
let inputReadFileDescriptor = IODescriptor(readEnd, closeWhenDone: true)
647+
let inputReadFileDescriptor = createIODescriptor(from: readEnd, closeWhenDone: true)
640648
var inputReadEnd: IOChannel? = inputReadFileDescriptor.createIOChannel()
641649

642-
let outputWriteFileDescriptor = IODescriptor(writeEnd, closeWhenDone: true)
650+
let outputWriteFileDescriptor = createIODescriptor(from: writeEnd, closeWhenDone: true)
643651
var outputWriteEnd: IOChannel? = outputWriteFileDescriptor.createIOChannel()
644652

645653
// Use shared error pipe instead of discarded
646-
let errorWriteFileDescriptor = IODescriptor(sharedErrorPipe.writeEnd, closeWhenDone: false)
654+
let errorWriteFileDescriptor: IODescriptor = createIODescriptor(from: sharedErrorPipe.writeEnd, closeWhenDone: false)
647655
var errorWriteEnd: IOChannel? = errorWriteFileDescriptor.createIOChannel()
648656

649657
let result = try await withThrowingTaskGroup(of: Int32.self) { group in
@@ -796,15 +804,15 @@ extension PipeConfiguration {
796804
}
797805
}
798806
case .swiftFunction(let function):
799-
let inputReadFileDescriptor = IODescriptor(readEnd, closeWhenDone: true)
807+
let inputReadFileDescriptor = createIODescriptor(from: readEnd, closeWhenDone: true)
800808
var inputReadEnd: IOChannel? = inputReadFileDescriptor.createIOChannel()
801809

802810
var outputPipe = try self.output.createPipe()
803811
let outputWriteFileDescriptor = outputPipe.writeFileDescriptor()
804812
var outputWriteEnd: IOChannel? = outputWriteFileDescriptor?.createIOChannel()
805813

806814
// Use shared error pipe instead of discarded
807-
let errorWriteFileDescriptor = IODescriptor(sharedErrorPipe.writeEnd, closeWhenDone: false)
815+
let errorWriteFileDescriptor = createIODescriptor(from: sharedErrorPipe.writeEnd, closeWhenDone: false)
808816
var errorWriteEnd: IOChannel? = errorWriteFileDescriptor.createIOChannel()
809817

810818
let result: (Int32, Output.OutputType) = try await withThrowingTaskGroup(of: (Int32, OutputCapturingState<Output.OutputType, ()>?).self) { group in

0 commit comments

Comments
 (0)