From bcf1df8dd65fb24c767ca91159fc5639dbd5375f Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 2 May 2020 18:44:33 -0400 Subject: wait for the agent to exit before returning from quit --- src/bin/rbw/actions.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/bin/rbw/actions.rs b/src/bin/rbw/actions.rs index b3a9f1b..273b038 100644 --- a/src/bin/rbw/actions.rs +++ b/src/bin/rbw/actions.rs @@ -1,4 +1,5 @@ use anyhow::Context as _; +use std::io::Read as _; pub fn login() -> anyhow::Result<()> { simple_action(rbw::protocol::Action::Login, "login") @@ -19,10 +20,16 @@ pub fn lock() -> anyhow::Result<()> { pub fn quit() -> anyhow::Result<()> { match crate::sock::Sock::connect() { Ok(mut sock) => { + let runtime_dir = rbw::dirs::runtime_dir(); + let pidfile = runtime_dir.join("pidfile"); + let mut pid = String::new(); + std::fs::File::open(pidfile)?.read_to_string(&mut pid)?; + let pid = nix::unistd::Pid::from_raw(pid.parse()?); sock.send(&rbw::protocol::Request { tty: std::env::var("TTY").ok(), action: rbw::protocol::Action::Quit, })?; + wait_for_exit(pid)?; Ok(()) } Err(e) => { @@ -96,3 +103,13 @@ fn simple_action( _ => Err(anyhow::anyhow!("unexpected message: {:?}", res)), } } + +fn wait_for_exit(pid: nix::unistd::Pid) -> anyhow::Result<()> { + loop { + if nix::sys::signal::kill(pid, None).is_err() { + break; + } + std::thread::sleep(std::time::Duration::from_millis(10)); + } + Ok(()) +} -- cgit v1.2.3-54-g00ecf