chiark / gitweb /
wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 21 Jul 2020 21:09:54 +0000 (22:09 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 21 Jul 2020 21:21:42 +0000 (22:21 +0100)
src/command.rs [new file with mode: 0644]

diff --git a/src/command.rs b/src/command.rs
new file mode 100644 (file)
index 0000000..7a60425
--- /dev/null
@@ -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<u32, anyhow::Error>,
+}
+
+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!("<euid {}>", uid))
+        })().ok_or_else(|e| format!("<error: {}>", &e)));
+
+        thread::Builder::new()
+          .name(desc.clone())
+          .spawn().context
+        match euid
+          .and_then(
+            |uid| 
+              .map_err(|e| anyhow!("<euid {:?} lookup failed {}",
+                                   uid, e))
+              .and_then(|pwent| pwent.ok_or_else(
+                
+                    
+        {
+          Err(e) => 
+          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 {
+      
+  }
+}