CLI (run): Only ask for stdin for -i (#483)

Today if you asked for a pty and also wanted to detach we'd open stdin
and then immediately close that pipe which would close the guest relay
as well. I don't believe we need stdin open unless it's asked for with
-i. Truthfully there's one extra bit here that is needed which is if -i
and -d are supplied we need to tell the daemon to open stdin, but not
send an fd (as they're client supplied and the client/cli is going to
exit immediately). That will need to be a followup, as it's mainly
useful for attach which we don't have today.
This commit is contained in:
Danny Canter
2025-08-11 23:53:53 -04:00
committed by GitHub
parent 71ee41f7be
commit adf7186d54
+15 -17
View File
@@ -205,30 +205,28 @@ struct ProcessIO {
var stdio = [FileHandle?](repeating: nil, count: 3)
let stdin: Pipe? = {
if !interactive && !tty {
if !interactive {
return nil
}
return Pipe()
}()
if let stdin {
if interactive {
let pin = FileHandle.standardInput
let stdinOSFile = OSFile(fd: pin.fileDescriptor)
let pipeOSFile = OSFile(fd: stdin.fileHandleForWriting.fileDescriptor)
try stdinOSFile.makeNonBlocking()
nonisolated(unsafe) let buf = UnsafeMutableBufferPointer<UInt8>.allocate(capacity: Int(getpagesize()))
let pin = FileHandle.standardInput
let stdinOSFile = OSFile(fd: pin.fileDescriptor)
let pipeOSFile = OSFile(fd: stdin.fileHandleForWriting.fileDescriptor)
try stdinOSFile.makeNonBlocking()
nonisolated(unsafe) let buf = UnsafeMutableBufferPointer<UInt8>.allocate(capacity: Int(getpagesize()))
pin.readabilityHandler = { _ in
Self.streamStdin(
from: stdinOSFile,
to: pipeOSFile,
buffer: buf,
) {
pin.readabilityHandler = nil
buf.deallocate()
try? stdin.fileHandleForWriting.close()
}
pin.readabilityHandler = { _ in
Self.streamStdin(
from: stdinOSFile,
to: pipeOSFile,
buffer: buf,
) {
pin.readabilityHandler = nil
buf.deallocate()
try? stdin.fileHandleForWriting.close()
}
}
stdio[0] = stdin.fileHandleForReading