From: Ian Jackson Date: Sat, 25 Jul 2020 18:51:39 +0000 (+0100) Subject: reply in lexpr X-Git-Tag: otter-0.2.0~1264 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=593dccbd7f75b5d334ca9cffa22ef22dbf33c23d;p=otter.git reply in lexpr --- diff --git a/src/cmdlistener.rs b/src/cmdlistener.rs index 694a6ec3..89cd3184 100644 --- a/src/cmdlistener.rs +++ b/src/cmdlistener.rs @@ -21,10 +21,12 @@ pub struct CommandListener { listener : UnixListener, } +type CSWrite = BufWriter; + struct CommandStream { euid : Result, read : io::Lines>, - write : UnixStream, + write : CSWrite, } type CSE = anyhow::Error; @@ -34,8 +36,9 @@ impl CommandStream { pub fn mainloop(mut self) { for l in &mut self.read { let l = l.context("read")?; - let reply = decode_and_process(&l); - writeln!(&mut self.write, "Reply: {:?}", &reply)?; + decode_and_process(&l, &mut self.write)?; + write!(&mut self.write, "\n")?; + self.write.flush()?; } } } @@ -52,9 +55,11 @@ use MgmtError::*; type ME = MgmtError; -pub fn decode_and_process(s: &str) -> MgmtResponse { - self::decode_process_inner(s) - .unwrap_or_else(|e| MgmtResponse::Error(format!("{}", e))) +#[throws(CSE)] +pub fn decode_and_process(s: &str, w: &mut CSWrite) { + let resp = self::decode_process_inner(s) + .unwrap_or_else(|e| MgmtResponse::Error(format!("{}", e))); + serde_lexpr::to_writer(w, &resp)?; } #[throws(ME)] @@ -124,9 +129,10 @@ impl CommandListener { write!(&mut desc, " user={}", user_desc)?; let read = conn.try_clone().context("dup the command stream")?; - let write = conn; let read = BufReader::new(read); let read = read.lines(); + let write = conn; + let write = BufWriter::new(write); let cs = CommandStream { read, write, euid }; cs.mainloop()?;