aboutsummaryrefslogtreecommitdiff
path: root/src/remote/host_unix.rs
diff options
context:
space:
mode:
authorJJ Liebig <jonathan.liebig@gmail.com>2026-09-08 23:08:42 +0200
committerGitHub <noreply@github.com>2026-09-09 00:08:42 +0300
commit8996fc54fe4596368a1677821b1a390a70c56ab0 (patch)
tree65ff0293a3ee17b4acc50539bff382388abaf927 /src/remote/host_unix.rs
parent68c7b78ec237034cbb0e21c8666842ed7991641d (diff)
fix: support preinstalled windows remote hosts (#3661)
* fix: support windows hosts in saved ssh machines refs #3651 * fix: keep windows ssh bridge writes blocking refs #3651 * fix: close saved windows ssh bootstrap input refs #3651 * refactor: simplify remote bridge helpers refs #3651 * refactor: isolate remote bridge platform behavior refs #3651 * fix: close captured ssh input under windows consoles refs #3651 * test: remove redundant remote command assertions refs #3651 refs #3701 * test: handle framed ssh commands in machine setup refs #3651 --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
Diffstat (limited to 'src/remote/host_unix.rs')
-rw-r--r--src/remote/host_unix.rs74
1 files changed, 0 insertions, 74 deletions
diff --git a/src/remote/host_unix.rs b/src/remote/host_unix.rs
deleted file mode 100644
index 48b20e0b..00000000
--- a/src/remote/host_unix.rs
+++ /dev/null
@@ -1,74 +0,0 @@
-//! Unix remote-host side of the SSH stdio bridge.
-
-use std::io;
-use std::os::unix::net::UnixStream;
-use std::thread;
-use std::time::Duration;
-
-pub(crate) fn run_remote_client_bridge() -> io::Result<()> {
- ensure_remote_server_running()?;
-
- let socket_path = crate::server::socket_paths::client_socket_path();
- let stream = UnixStream::connect(&socket_path).map_err(|err| {
- io::Error::new(
- err.kind(),
- format!(
- "failed to connect to remote Herdr client socket {}: {err}",
- socket_path.display()
- ),
- )
- })?;
-
- let mut stdout = io::stdout().lock();
- let mut socket_to_stdout = stream.try_clone()?;
- let mut stdin_to_socket = stream;
-
- let _upload = thread::spawn(move || {
- let mut stdin = io::stdin();
- let _ = copy_flush(&mut stdin, &mut stdin_to_socket);
- let _ = stdin_to_socket.shutdown(std::net::Shutdown::Write);
- });
-
- copy_flush(&mut socket_to_stdout, &mut stdout).map(|_| ())
-}
-
-fn copy_flush<R: io::Read, W: io::Write>(reader: &mut R, writer: &mut W) -> io::Result<u64> {
- let mut buffer = [0_u8; 16 * 1024];
- let mut total = 0;
- loop {
- let read = match reader.read(&mut buffer) {
- Ok(0) => return Ok(total),
- Ok(read) => read,
- Err(err) if err.kind() == io::ErrorKind::Interrupted => continue,
- Err(err) => return Err(err),
- };
- writer.write_all(&buffer[..read])?;
- writer.flush()?;
- total += read as u64;
- }
-}
-
-fn ensure_remote_server_running() -> io::Result<()> {
- let socket_path = crate::server::socket_paths::client_socket_path();
- if crate::server::autodetect::is_server_listening() {
- let status = crate::api::read_runtime_status_at(
- &crate::api::socket_path(),
- Duration::from_millis(500),
- )?
- .ok_or_else(|| io::Error::other("remote server status API is unavailable"))?;
- if status
- .capabilities
- .as_ref()
- .and_then(|capabilities| capabilities.endpoint_protocol_generation)
- == Some(crate::protocol::endpoint::ENDPOINT_PROTOCOL_GENERATION)
- {
- return Ok(());
- }
- return Err(io::Error::other(
- "remote herdr server needs one final update before this bridge can attach; rerun `herdr --remote` from an interactive terminal to approve it",
- ));
- }
-
- crate::server::autodetect::spawn_server_daemon()?;
- crate::server::autodetect::wait_for_server_socket(&socket_path, Duration::from_secs(5))
-}