listener : UnixListener,
}
+type CSWrite = BufWriter<UnixStream>;
+
struct CommandStream {
euid : Result<u32, anyhow::Error>,
read : io::Lines<BufReader<UnixStream>>,
- write : UnixStream,
+ write : CSWrite,
}
type CSE = anyhow::Error;
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()?;
}
}
}
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)]
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()?;