From ace0da9253c288a28a4e5e97e7c1dbb63f20803c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Cluseau?= Date: Thu, 16 Jul 2026 10:38:26 +0200 Subject: [PATCH] sshd: reduce tokio usage --- src/cmd/init/sshd.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/cmd/init/sshd.rs b/src/cmd/init/sshd.rs index 5acba9f..f335d2a 100644 --- a/src/cmd/init/sshd.rs +++ b/src/cmd/init/sshd.rs @@ -1,6 +1,8 @@ use log::{info, warn}; -use std::{fs, io::Write, os::unix::fs::PermissionsExt, process::Stdio}; -use tokio::{net, process::Command}; +use std::{ + fs, io::Write, os::unix::fs::PermissionsExt, process::Command, process::Stdio, sync::Arc, + thread, +}; use super::retry_or_ignore; use dkl::bootstrap::{Config, SSHServer}; @@ -29,22 +31,24 @@ pub async fn start(cfg: &Config) { }) .await; - let cfg = cfg.ssh.clone(); + let cfg = Arc::new(cfg.ssh.clone()); retry_or_ignore(async move || { // don't pre-start sshd as it should rarely be useful at this stage, use inetd-style. let listen_addr = cfg.listen.clone(); info!("ssh: starting listener on {listen_addr}"); - let listener = net::TcpListener::bind(listen_addr).await?; + let listener = tokio::net::TcpListener::bind(listen_addr).await?; - tokio::spawn(handle_ssh_connections(listener, cfg.clone())); + let cfg = cfg.clone(); + let listener = listener.into_std().unwrap(); + thread::spawn(move || handle_ssh_connections(listener, &cfg)); Ok(()) }) .await; } -async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) { +fn handle_ssh_connections(listener: std::net::TcpListener, cfg: &SSHServer) { let mut sshd_args = Vec::new(); sshd_args.extend(["-i", "-E", "/var/log/sshd.log"]); @@ -62,7 +66,7 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) { let mut keygen_done = false; loop { - let (stream, remote) = match listener.accept().await { + let (stream, remote) = match listener.accept() { Ok(v) => v, Err(e) => { warn!("ssh: listener stopped: {e}"); @@ -72,7 +76,7 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) { if !keygen_done { // make sure we have ssh host keys even if not provided - if (Command::new("ssh-keygen").arg("-A").status().await) + if (Command::new("ssh-keygen").arg("-A").status()) .inspect_err(|e| warn!("ssh-keygen failed: {e}")) .is_ok_and(|s| s.success()) { @@ -96,11 +100,11 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) { continue; }; - let pid = child.id().unwrap(); + let pid = child.id(); info!("ssh: new connection from {remote}, sshd PID {pid}"); tokio::spawn(async move { - let _ = child.wait().await; + let _ = child.wait(); }); } }