Add interactive client terminal transport
This commit is contained in:
parent
d597b05484
commit
6816f0632e
1 changed files with 1454 additions and 59 deletions
|
|
@ -2,7 +2,7 @@ use std::collections::BTreeMap;
|
|||
use std::ffi::OsString;
|
||||
use std::fmt;
|
||||
use std::fs::File;
|
||||
use std::io::{self, Write};
|
||||
use std::io::{self, IsTerminal, Write};
|
||||
use std::os::fd::{AsFd, AsRawFd};
|
||||
use std::os::unix::fs::MetadataExt;
|
||||
use std::path::PathBuf;
|
||||
|
|
@ -27,7 +27,8 @@ use rustix::pipe::{PipeFlags, pipe_with};
|
|||
|
||||
use crate::{
|
||||
BootstrapAcquisition, ClientBackend, ClientCommand, ClientError, ClientSessionIdentity,
|
||||
ControlEndpoint, DomainStatus, execute_over_control_face_as,
|
||||
ControlEndpoint, DomainStatus, execute_interactive_over_control_face_as,
|
||||
execute_over_control_face_as,
|
||||
};
|
||||
|
||||
#[derive(Debug)]
|
||||
|
|
@ -335,7 +336,17 @@ impl ClientBackend for ProductionClientBackend {
|
|||
stdout: &mut dyn Write,
|
||||
stderr: &mut dyn Write,
|
||||
) -> Result<i32, ClientError<Self::Error>> {
|
||||
let exit = execute_over_control_face_as(&endpoint, argv, stdout, stderr, &self.identity)?;
|
||||
let exit = if std::io::stdin().is_terminal() && std::io::stdout().is_terminal() {
|
||||
let mut terminal = crate::terminal::SystemTerminal::open()?;
|
||||
execute_interactive_over_control_face_as(
|
||||
&endpoint,
|
||||
argv,
|
||||
&mut terminal,
|
||||
&self.identity,
|
||||
)?
|
||||
} else {
|
||||
execute_over_control_face_as(&endpoint, argv, stdout, stderr, &self.identity)?
|
||||
};
|
||||
if let Some(coordinator) = self.coordinator.take() {
|
||||
let status = coordinator
|
||||
.reap()
|
||||
|
|
|
|||
Loading…
Reference in a new issue