better error messages

This commit is contained in:
Ferdinand Schober
2023-02-13 17:40:52 +01:00
parent 1c3cd775a3
commit 6898a961cb
2 changed files with 35 additions and 25 deletions

View File

@@ -95,19 +95,25 @@ impl App {
let keyboard: Vk = self.vkm.create_virtual_keyboard(&self.seat, &self.qh, ()); let keyboard: Vk = self.vkm.create_virtual_keyboard(&self.seat, &self.qh, ());
// receive keymap from device // receive keymap from device
eprintln!("connecting to {}", client.addr); eprint!("\rconnecting to {} ", client.addr);
let mut attempts = 0;
let data = loop { let data = loop {
match request::request_data(client.addr, Request::KeyMap) { let result = request::request_data(client.addr, Request::KeyMap);
Some(data) => break data, eprint!("\rconnecting to {} ", client.addr);
None => { for _ in 0..attempts { eprint!("."); }
eprint!("."); match result {
io::stderr().flush().unwrap(); Ok(data) => break data,
thread::sleep(Duration::from_millis(500)); Err(e) => { eprint!(" - {}", e); }
}
} }
io::stderr().flush().unwrap();
thread::sleep(Duration::from_millis(500));
attempts += 1;
}; };
eprint!("\rconnecting to {} ", client.addr);
for _ in 0..attempts { eprint!("."); }
eprintln!(" done! ");
// TODO use shm_open // TODO use shm_open
let f = tempfile::tempfile().unwrap(); let f = tempfile::tempfile().unwrap();
let mut buf = BufWriter::new(&f); let mut buf = BufWriter::new(&f);

View File

@@ -4,7 +4,7 @@ use std::{
io::prelude::*, io::prelude::*,
net::{SocketAddr, TcpListener, TcpStream}, net::{SocketAddr, TcpListener, TcpStream},
sync::{Arc, RwLock}, sync::{Arc, RwLock},
thread::{self, JoinHandle}, thread::{self, JoinHandle}, fmt::Display,
}; };
use memmap::Mmap; use memmap::Mmap;
@@ -83,47 +83,51 @@ impl Server {
} }
} }
pub fn request_data(addr: SocketAddr, req: Request) -> Option<Vec<u8>> { #[derive(Debug)]
pub struct BadRequest;
impl Display for BadRequest {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "BadRequest")
}
}
impl Error for BadRequest {}
pub fn request_data(addr: SocketAddr, req: Request) -> Result<Vec<u8>, Box<dyn Error>> {
// connect to server // connect to server
let mut sock = match TcpStream::connect(addr) { let mut sock = match TcpStream::connect(addr) {
Ok(sock) => sock, Ok(sock) => sock,
Err(e) => { Err(e) => return Err(Box::new(e)),
eprintln!("{}", e);
return None;
}
}; };
// write the request to the socket // write the request to the socket
// convert to u32 // convert to u32
let req: u32 = req as u32; let req: u32 = req as u32;
if let Err(e) = sock.write(&req.to_ne_bytes()) { if let Err(e) = sock.write(&req.to_ne_bytes()) {
eprintln!("{}", e); return Err(Box::new(e));
return None;
} }
if let Err(e) = sock.flush() { if let Err(e) = sock.flush() {
eprintln!("{}", e); return Err(Box::new(e));
return None;
} }
// read the response = (len, data) - len 0 means no data / bad request // read the response = (len, data) - len 0 means no data / bad request
// read len // read len
let mut buf = [0u8; 8]; let mut buf = [0u8; 8];
if let Err(e) = sock.read_exact(&mut buf[..]) { if let Err(e) = sock.read_exact(&mut buf[..]) {
eprintln!("{}", e); return Err(Box::new(e));
return None;
} }
let len = usize::from_ne_bytes(buf); let len = usize::from_ne_bytes(buf);
// check for bad request // check for bad request
if len == 0 { if len == 0 {
return None; return Err(Box::new(BadRequest{}));
} }
// read the data // read the data
let mut data: Vec<u8> = vec![0u8; len]; let mut data: Vec<u8> = vec![0u8; len];
if let Err(e) = sock.read_exact(&mut data[..]) { if let Err(e) = sock.read_exact(&mut data[..]) {
eprintln!("{}", e); return Err(Box::new(e));
return None;
} }
Some(data) Ok(data)
} }