From 0fafedc7062e51b43f603c626a0f148ba4ca954e Mon Sep 17 00:00:00 2001 From: 21pages Date: Sat, 1 Jul 2023 13:40:57 +0800 Subject: [PATCH] add error message judgement to set_force_relay Signed-off-by: 21pages --- src/client.rs | 16 +++++++++------- src/client/io_loop.rs | 2 +- src/port_forward.rs | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/client.rs b/src/client.rs index d726b713b..a0a5e6cc0 100644 --- a/src/client.rs +++ b/src/client.rs @@ -55,11 +55,11 @@ use scrap::{ use crate::is_keyboard_mode_supported; -#[cfg(not(any(target_os = "android", target_os = "ios")))] -use crate::{check_clipboard, ClipboardContext, CLIPBOARD_INTERVAL}; #[cfg(not(feature = "flutter"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] use crate::ui_session_interface::SessionPermissionConfig; +#[cfg(not(any(target_os = "android", target_os = "ios")))] +use crate::{check_clipboard, ClipboardContext, CLIPBOARD_INTERVAL}; pub use super::lang::*; @@ -535,7 +535,7 @@ impl Client { let bytes = match res { Ok(bytes) => bytes, Err(err) => { - interface.set_force_relay(direct, false); + interface.set_force_relay(direct, false, err.to_string()); bail!("{}", err); } }; @@ -1760,12 +1760,14 @@ impl LoginConfigHandler { msg_out } - pub fn set_force_relay(&mut self, direct: bool, received: bool) { + pub fn set_force_relay(&mut self, direct: bool, received: bool, err: String) { self.force_relay = false; if direct && !received { let errno = errno::errno().0; // TODO: check mac and ios - if cfg!(windows) && errno == 10054 || !cfg!(windows) && errno == 104 { + if cfg!(windows) && (errno == 10054 || err.contains("10054")) + || !cfg!(windows) && (errno == 104 || err.contains("104")) + { self.force_relay = true; self.set_option("force-always-relay".to_owned(), "Y".to_owned()); } @@ -2315,11 +2317,11 @@ pub trait Interface: Send + Clone + 'static + Sized { async fn handle_test_delay(&mut self, t: TestDelay, peer: &mut Stream); fn get_login_config_handler(&self) -> Arc>; - fn set_force_relay(&self, direct: bool, received: bool) { + fn set_force_relay(&self, direct: bool, received: bool, err: String) { self.get_login_config_handler() .write() .unwrap() - .set_force_relay(direct, received); + .set_force_relay(direct, received, err); } fn is_force_relay(&self) -> bool { self.get_login_config_handler().read().unwrap().force_relay diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index ff1387dd0..3a7c906c6 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -161,7 +161,7 @@ impl Remote { match res { Err(err) => { log::error!("Connection closed: {}", err); - self.handler.set_force_relay(direct, received); + self.handler.set_force_relay(direct, received, err.to_string()); let msgtype = "error"; let title = "Connection Error"; let text = err.to_string(); diff --git a/src/port_forward.rs b/src/port_forward.rs index 62ba7b41c..d1450f09e 100644 --- a/src/port_forward.rs +++ b/src/port_forward.rs @@ -192,7 +192,7 @@ async fn connect_and_login_2( } Ok(Some(Err(err))) => { log::error!("Connection closed: {}", err); - interface.set_force_relay(direct, received); + interface.set_force_relay(direct, received, err.to_string()); bail!("Connection closed: {}", err); } _ => {