aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-05-02 18:44:33 -0400
committerJesse Luehrs <doy@tozt.net>2020-05-02 18:44:33 -0400
commitbcf1df8dd65fb24c767ca91159fc5639dbd5375f (patch)
treee37496f1bb27e35bd6226f6747e148899452ab33
parent9bfd14efd09cfafa0cf7d7896e663ed392c96ff7 (diff)
downloadrbw-bcf1df8dd65fb24c767ca91159fc5639dbd5375f.tar.gz
rbw-bcf1df8dd65fb24c767ca91159fc5639dbd5375f.zip
wait for the agent to exit before returning from quit
-rw-r--r--src/bin/rbw/actions.rs17
1 files changed, 17 insertions, 0 deletions
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(())
+}