1use std::process::Stdio;23use anyhow::Context as _;4use futures::StreamExt as _;5use tokio::process::{Child, Command};6use tokio_util::codec::{FramedRead, LinesCodec};7use zbus::Connection;89pub struct PrivateBus {10 pub address: String,11 pub conn: Connection,12 _child: Child,13}1415pub async fn spawn() -> anyhow::Result<PrivateBus> {16 let mut child = Command::new("dbus-daemon")17 .args(["--session", "--nofork", "--print-address"])18 .stdout(Stdio::piped())19 .kill_on_drop(true)20 .spawn()21 .context("spawning dbus-daemon for the private bus")?;2223 let stdout = child.stdout.take().expect("piped");24 let address = FramedRead::new(stdout, LinesCodec::new())25 .next()26 .await27 .context("dbus-daemon exited before printing its address")?28 .context("reading dbus-daemon address")?;2930 let conn = zbus::connection::Builder::address(address.as_str())?31 .build()32 .await33 .context("connecting to the private bus")?;3435 Ok(PrivateBus {36 address,37 conn,38 _child: child,39 })40}