Small tweaks and fixes

This commit is contained in:
John Doty 2022-10-16 13:34:31 -07:00
parent 20412a4815
commit 1308f8828a
2 changed files with 37 additions and 35 deletions

View file

@ -76,16 +76,20 @@ pub async fn run_server() {
/// Wait for the server to be ready; we know the server is there and /// Wait for the server to be ready; we know the server is there and
/// listening when we see the special sync marker, which is 8 NUL bytes in a /// listening when we see the special sync marker, which is 8 NUL bytes in a
/// row. /// row.
/// async fn client_sync<S: AsyncRead + Unpin, T: AsyncRead + Unpin>(
/// TODO: We should be pumping stderr too. reader: &mut S,
async fn client_sync<Read: AsyncRead + Unpin>( client_stderr: &mut T,
reader: &mut Read,
) -> Result<(), tokio::io::Error> { ) -> Result<(), tokio::io::Error> {
info!("Waiting for synchronization marker..."); info!("Waiting for synchronization marker...");
let mut stderr = tokio::io::stderr();
let mut stdout = tokio::io::stdout(); let mut stdout = tokio::io::stdout();
let mut seen = 0; let mut seen = 0;
tokio::select! { tokio::select! {
result = tokio::io::copy(client_stderr, &mut stderr) => match result {
Ok(_) => Ok(()), // ?
Err(e) => Err(e),
},
result = async { result = async {
while seen < 8 { while seen < 8 {
let byte = reader.read_u8().await?; let byte = reader.read_u8().await?;
@ -193,30 +197,8 @@ async fn client_handle_connection(
info!("Connection established on port {}", port); info!("Connection established on port {}", port);
let (client_read_half, client_write_half) = socket.into_split(); let mut socket = socket;
let (server_read_half, server_write_half) = dest_socket.into_split(); tokio::io::copy_bidirectional(&mut socket, &mut dest_socket).await?;
let client_to_server = tokio::spawn(async move {
let mut client_read_half = client_read_half;
let mut server_write_half = server_write_half;
tokio::io::copy(&mut client_read_half, &mut server_write_half).await
});
let server_to_client = tokio::spawn(async move {
let mut server_read_half = server_read_half;
let mut client_write_half = client_write_half;
tokio::io::copy(&mut server_read_half, &mut client_write_half).await
});
let client_err = client_to_server.await;
debug!("Done client -> server");
let svr_err = server_to_client.await;
debug!("Done server -> client");
if let Ok(Err(e)) = client_err {
return Err(e.into());
} else if let Ok(Err(e)) = svr_err {
return Err(e.into());
}
Ok(()) Ok(())
} }
@ -393,7 +375,7 @@ async fn client_connect_loop(remote: &str, events: mpsc::Sender<ui::UIEvent>) {
.expect("child did not have a handle to stdout"), .expect("child did not have a handle to stdout"),
); );
if let Err(e) = client_sync(&mut reader).await { if let Err(e) = client_sync(&mut reader, &mut stderr).await {
error!("Error synchronizing: {:?}", e); error!("Error synchronizing: {:?}", e);
match child.wait().await { match child.wait().await {
Ok(status) => { Ok(status) => {

View file

@ -2,7 +2,7 @@ use crate::client_listen;
use crate::message::PortDesc; use crate::message::PortDesc;
use anyhow::Result; use anyhow::Result;
use crossterm::{ use crossterm::{
cursor::{MoveTo, RestorePosition, SavePosition}, cursor::MoveTo,
event::{Event, EventStream, KeyCode, KeyEvent, KeyModifiers}, event::{Event, EventStream, KeyCode, KeyEvent, KeyModifiers},
execute, queue, execute, queue,
style::{Color, PrintStyledContent, Stylize}, style::{Color, PrintStyledContent, Stylize},
@ -68,6 +68,7 @@ pub struct UI {
ports: Option<Vec<PortDesc>>, ports: Option<Vec<PortDesc>>,
lines: VecDeque<String>, lines: VecDeque<String>,
alternate_screen: bool, alternate_screen: bool,
raw_mode: bool,
} }
impl UI { impl UI {
@ -82,11 +83,14 @@ impl UI {
ports: None, ports: None,
lines: VecDeque::with_capacity(1024), lines: VecDeque::with_capacity(1024),
alternate_screen: false, alternate_screen: false,
raw_mode: false,
} }
} }
pub async fn run(&mut self) -> Result<()> { pub async fn run(&mut self) -> Result<()> {
self.enter_alternate_screen()?;
let result = self.run_core().await; let result = self.run_core().await;
_ = self.disable_raw_mode();
_ = self.leave_alternate_screen(); _ = self.leave_alternate_screen();
result result
} }
@ -109,7 +113,7 @@ impl UI {
} }
fn render_disconnected(&mut self) -> Result<()> { fn render_disconnected(&mut self) -> Result<()> {
self.leave_alternate_screen()?; self.disable_raw_mode()?;
let mut stdout = stdout(); let mut stdout = stdout();
let (columns, _) = size()?; let (columns, _) = size()?;
@ -117,20 +121,19 @@ impl UI {
execute!( execute!(
stdout, stdout,
SavePosition, Clear(ClearType::All),
MoveTo(0, 0), MoveTo(0, 0),
PrintStyledContent( PrintStyledContent(
format!("{:^columns$}", "Not Connected") format!("{:^columns$}\r\n", "Not Connected")
.with(Color::Black) .with(Color::Black)
.on(Color::Red) .on(Color::Red)
), ),
RestorePosition,
)?; )?;
Ok(()) Ok(())
} }
fn render_connected(&mut self) -> Result<()> { fn render_connected(&mut self) -> Result<()> {
self.enter_alternate_screen()?; self.enable_raw_mode()?;
let mut stdout = stdout(); let mut stdout = stdout();
let (columns, rows) = size()?; let (columns, rows) = size()?;
@ -254,6 +257,22 @@ impl UI {
} }
} }
fn enable_raw_mode(&mut self) -> Result<()> {
if !self.raw_mode {
enable_raw_mode()?;
self.raw_mode = true;
}
Ok(())
}
fn disable_raw_mode(&mut self) -> Result<()> {
if self.raw_mode {
disable_raw_mode()?;
self.raw_mode = false;
}
Ok(())
}
fn enter_alternate_screen(&mut self) -> Result<()> { fn enter_alternate_screen(&mut self) -> Result<()> {
if !self.alternate_screen { if !self.alternate_screen {
enable_raw_mode()?; enable_raw_mode()?;
@ -333,6 +352,7 @@ impl UI {
match event { match event {
Some(UIEvent::Disconnected) => { Some(UIEvent::Disconnected) => {
self.socks_port = 0; self.socks_port = 0;
self.listeners = HashMap::new(); // Bye.
} }
Some(UIEvent::Connected(sp)) => { Some(UIEvent::Connected(sp)) => {
self.socks_port = sp; self.socks_port = sp;