Skip to content

Commit 0589fb3

Browse files
committed
Correct the conversion of the platform descriptor to FileHandle on Windows
1 parent 0ef16cf commit 0589fb3

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

Sources/Subprocess/PipeConfiguration.swift

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,28 @@ private func createTerminationStatus(_ exitCode: UInt32) -> TerminationStatus {
299299
#endif
300300
}
301301

302+
private func createPipe() throws -> (readEnd: FileDescriptor, writeEnd: FileDescriptor) {
303+
var createdPipe = try CreatedPipe(closeWhenDone: false, purpose: .output)
304+
305+
#if canImport(WinSDK)
306+
let readHandle = createdPipe.readFileDescriptor()!.platformDescriptor()
307+
let writeHandle = createdPipe.writeFileDescriptor()!.platformDescriptor()
308+
let readFd = _open_osfhandle(
309+
intptr_t(bitPattern: readHandle),
310+
FileDescriptor.AccessMode.readOnly.rawValue
311+
)
312+
let writeFd = _open_osfhandle(
313+
intptr_t(bitPattern: writeHandle),
314+
FileDescriptor.AccessMode.writeOnly.rawValue
315+
)
316+
#else
317+
let readFd = createdPipe.readFileDescriptor()!.platformDescriptor()
318+
let writeFd = createdPipe.writeFileDescriptor()!.platformDescriptor()
319+
#endif
320+
321+
return (readEnd: FileDescriptor(rawValue: readFd), writeEnd: FileDescriptor(rawValue: writeFd))
322+
}
323+
302324
// MARK: - Internal Functions
303325

304326
extension PipeConfiguration {
@@ -425,8 +447,7 @@ extension PipeConfiguration {
425447
/// Run the pipeline using withTaskGroup
426448
private func runPipeline() async throws -> CollectedResult<Output, Error> {
427449
// Create a pipe for standard error
428-
var sharedErrorCreatedPipe = try CreatedPipe(closeWhenDone: false, purpose: .output)
429-
let sharedErrorPipe = (readEnd: FileDescriptor(rawValue: sharedErrorCreatedPipe.readFileDescriptor()!.platformDescriptor()), writeEnd: FileDescriptor(rawValue: sharedErrorCreatedPipe.writeFileDescriptor()!.platformDescriptor()))
450+
let sharedErrorPipe = try createPipe()
430451

431452
return try await withThrowingTaskGroup(of: CollectedPipeResult.self, returning: CollectedResult<Output, Error>.self) { group in
432453
// Collect error output from all stages
@@ -444,8 +465,7 @@ extension PipeConfiguration {
444465
// Create pipes between stages
445466
var pipes: [(readEnd: FileDescriptor, writeEnd: FileDescriptor)] = []
446467
for _ in 0..<(stages.count - 1) {
447-
var pipe = try CreatedPipe(closeWhenDone: false, purpose: .input)
448-
pipes.append((readEnd: FileDescriptor(rawValue: pipe.readFileDescriptor()!.platformDescriptor()), writeEnd: FileDescriptor(rawValue: pipe.writeFileDescriptor()!.platformDescriptor())))
468+
try pipes.append(createPipe())
449469
}
450470

451471
let pipeResult = try await withThrowingTaskGroup(of: PipelineTaskResult.self, returning: CollectedResult<Output, DiscardedOutput>.self) { group in

0 commit comments

Comments
 (0)