From: Ian Jackson Date: Tue, 21 Jul 2020 21:09:54 +0000 (+0100) Subject: wip X-Git-Tag: otter-0.2.0~1279 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=daae32f9f518d112cbbf3f05b4ec2a640175c387;p=otter.git wip --- diff --git a/src/command.rs b/src/command.rs new file mode 100644 index 00000000..7a604250 --- /dev/null +++ b/src/command.rs @@ -0,0 +1,89 @@ + +use crate::imports::*; + +use std::os::unix::prelude; + +pub use std::os::unix::net::UnixStream; + +use std::os::unix::net::UnixListener; +use uds::UnixListenerExt; +use pwd::Passwd; + +const SOCKET_PATH : &str = "command.socket"; // xxx + +struct CommandListener { + listener : UnixListener; +} + +struct CommandStream { + conn : UnixStream, + euid : Result, +} + +impl CommandListener { + #[throws(OE)] + fn new() -> Self { + let listener = UnixListener::bind(SOCKET_PATH)?; + CommandListener { listener } + } + #[throws(OE)] + fn process_one() -> Self { + let (conn, caller) = self.listener.accept()?; + let desc = format!("conn={:?} peer={:?}", &client, &caller); + eprintln!("command connection {}: accepted", client); + thread::spawn(move||{ + (||{ + let euid = conn.initial_peer_credentials() + .map_err(|e| anyhow!("initial_peer_credentials: {:?}", e)) + .and_then(|creds| creds.euid().ok_or_else( + || Err(anyhow!("initial_peer_credentials no euid!")))); + write!(&mut desc, " user={}", (||{ + let pwent = Passwd::from_uid(euid?) + .map_err(|e| format!("euid {} lookup failed {}",uid,e))?; + pwent.map_or_else(|p| p.name, + || format!("", uid)) + })().ok_or_else(|e| format!("", &e))); + + thread::Builder::new() + .name(desc.clone()) + .spawn().context + match euid + .and_then( + |uid| + .map_err(|e| anyhow!(" + Ok(u) => { + let pwent = Passwd::from_uid(euid); + + } + + + let credentials_euid = + cred + + match &credentials { + Ok(cred) { + match cred.euid() { + None => + Some(e) => Ok(e), + + + Ok( + }; + })().ok_or(|e|{ + xxx + }); + }); + } + + #[throws(OE)] + fn process() -> Self {n + loop { + + } +}