35 lines
1.1 KiB
Swift
35 lines
1.1 KiB
Swift
// SPDX-FileCopyrightText: 2026 Kaede Akino
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
import CSSH2
|
|
|
|
/// Queue-confined startup sizing. A PTY request and a process request each retain
|
|
/// their own arguments across EAGAIN; newer geometry is flushed between them.
|
|
nonisolated struct SSHPTYStartupSizing {
|
|
private var requestedSize: SSHPTYSize?
|
|
private var processRequestStarted = false
|
|
|
|
mutating func requestPTY(
|
|
resize: inout SSHPTYResizeState, send: (SSHPTYSize) -> Int32
|
|
) -> Int32 {
|
|
if requestedSize == nil { requestedSize = resize.requestedSize }
|
|
guard let size = requestedSize else { return LIBSSH2_ERROR_CHANNEL_CLOSED }
|
|
let result = send(size)
|
|
if result == 0 { resize.didCreatePTY(size: size) }
|
|
return result
|
|
}
|
|
|
|
mutating func startProcess(
|
|
resize: inout SSHPTYResizeState,
|
|
sendResize: (SSHPTYSize) -> Int32,
|
|
start: () -> Int32
|
|
) -> Int32 {
|
|
if !processRequestStarted {
|
|
let result = resize.flush(send: sendResize)
|
|
guard result == 0 else { return result }
|
|
processRequestStarted = true
|
|
}
|
|
return start()
|
|
}
|
|
}
|