From 24d740d178d568cfbc57858f971f1c2f720a6e53 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 23 Apr 2024 19:37:55 -0700 Subject: [PATCH] user: Add user-running manager prototype --- src/daemon.rs | 7 ++++++- src/main.rs | 3 ++- src/user.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/user.rs diff --git a/src/daemon.rs b/src/daemon.rs index 54a5e72..4fcccd5 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -5,7 +5,7 @@ * SPDX-License-Identifier: MIT */ -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, ensure, Result}; use tokio::signal::unix::{signal, Signal, SignalKind}; use tokio::task::JoinSet; use tokio_util::sync::CancellationToken; @@ -58,6 +58,11 @@ impl Daemon { } pub async fn run(&mut self) -> Result<()> { + ensure!( + !self.services.is_empty(), + "Can't run a daemon with no services attached." + ); + let mut res = tokio::select! { e = self.services.join_next() => match e.unwrap() { Ok(Ok(())) => Ok(()), diff --git a/src/main.rs b/src/main.rs index 06e2816..731178f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,7 @@ mod process; mod root; mod sls; mod systemd; +mod user; mod wifi; #[cfg(test)] @@ -157,7 +158,7 @@ pub async fn main() -> Result<()> { if args.root { root::daemon().await } else { - todo!(); + user::daemon().await } } diff --git a/src/user.rs b/src/user.rs new file mode 100644 index 0000000..183691a --- /dev/null +++ b/src/user.rs @@ -0,0 +1,52 @@ +/* + * Copyright © 2023 Collabora Ltd. + * Copyright © 2024 Valve Software + * + * SPDX-License-Identifier: MIT + */ + +use anyhow::{bail, Result}; +use tracing::error; +use tracing_subscriber::prelude::*; +use tracing_subscriber::{fmt, Registry}; +use zbus::connection::Connection; +use zbus::ConnectionBuilder; + +use crate::daemon::Daemon; + +async fn create_connection() -> Result { + let connection = ConnectionBuilder::session()? + .name("com.steampowered.SteamOSManager1")? + .build() + .await?; + Ok(connection) +} + +pub async fn daemon() -> Result<()> { + // This daemon is responsible for creating a dbus api that steam client can use to do various OS + // level things. It implements com.steampowered.SteamOSManager1.Manager interface + + let stdout_log = fmt::layer(); + let subscriber = Registry::default().with(stdout_log); + + let system = match Connection::system().await { + Ok(c) => c, + Err(e) => { + let _guard = tracing::subscriber::set_default(subscriber); + error!("Error connecting to DBus: {}", e); + bail!(e); + } + }; + let session = match create_connection().await { + Ok(c) => c, + Err(e) => { + let _guard = tracing::subscriber::set_default(subscriber); + error!("Error connecting to DBus: {}", e); + bail!(e); + } + }; + + let mut daemon = Daemon::new(subscriber, system.clone()).await?; + + daemon.run().await +}