From 0cca54c1511b478a9df309790b7a0f5270733b18 Mon Sep 17 00:00:00 2001 From: Dany LE Date: Thu, 26 Mar 2026 14:07:06 +0100 Subject: [PATCH] Add support to option enable_multiple_session --- references/daemon.conf | 5 +++++ src/configuration.rs | 19 +++++++++++++++++++ src/session.rs | 26 +++++++++++++++++++++----- src/tests.rs | 1 + 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/references/daemon.conf b/references/daemon.conf index 21b54ad..6431490 100644 --- a/references/daemon.conf +++ b/references/daemon.conf @@ -21,6 +21,11 @@ default_session_command = "/usr/bin/diyac -x /usr/bin/diya-login-shell" # if this setting is not set default_session_user = "xdg" +# if false keep only one session at a time +# open a new session will close any previously opened session +# default true, optional +enable_multiple_session = false + # User session command # The command to run to start a user session after the # login session is successful diff --git a/src/configuration.rs b/src/configuration.rs index ceadc37..e7974f4 100644 --- a/src/configuration.rs +++ b/src/configuration.rs @@ -23,6 +23,8 @@ pub struct Configuration { default_session_user: String, // optional (default root) /// The command to execute for user sessions (required). user_session_command: String, + /// flag to enable multiple session + enable_multiple_session: bool, } impl Configuration { @@ -71,6 +73,10 @@ impl Configuration { .and_then(Value::as_str) .ok_or("Missing user session command")? .to_string(), + enable_multiple_session: table + .get("enable_multiple_session") + .and_then(Value::as_bool) + .unwrap_or(true), }) } @@ -106,6 +112,14 @@ impl Configuration { pub fn user_session_command(&self) -> &str { &self.user_session_command } + + /// Is multiple session enabled + /// + /// # Returns + /// * bool value + pub fn enable_multiple_session(&self) -> bool { + self.enable_multiple_session + } } impl fmt::Display for Configuration { @@ -122,6 +136,11 @@ impl fmt::Display for Configuration { )?; writeln!(f, " - Default Session User: {}", self.default_session_user)?; writeln!(f, " - User Session Command: {}", self.user_session_command)?; + writeln!( + f, + " - Enable multiple session: {}", + self.enable_multiple_session + )?; Ok(()) } } diff --git a/src/session.rs b/src/session.rs index 6c6f418..cded421 100644 --- a/src/session.rs +++ b/src/session.rs @@ -402,7 +402,11 @@ impl SessionManager { }; match session.authenticate() { Ok(()) => { + DEBUG!("Authenticate success"); invocation.return_value(Some(&Variant::tuple_from_iter([true.to_variant()]))); + if ! self.config.enable_multiple_session() { + self.drop_all_sessions(); + } match self.open_session(self.config.user_session_command(), &session) { Ok(pid) => self.pids.push(pid), Err(error) => CRITICAL!("Failed to run user session: {}", error), @@ -485,11 +489,26 @@ impl SessionManager { Err(error) => { CRITICAL!("Unable to get session PID={} status: {}", pid, error); let _ = kill(*pid, Signal::SIGKILL); - let _ = waitpid(*pid, Some(WaitPidFlag::WNOHANG)); + let _ = waitpid(*pid, None); false } }); } + + /// Drop all opened session (including the default one) + /// + /// # Arguments + /// + /// - `&mut self` (`SessionManager`) - SessionManager + /// + fn drop_all_sessions(&mut self) { + DEBUG!("Dropping all running sessions"); + // kill all running session + for pid in self.pids.drain(..) { + let _ = kill(pid, Signal::SIGKILL); + let _ = waitpid(pid, None); + } + } } impl Drop for SessionManager { @@ -509,10 +528,7 @@ impl Drop for SessionManager { DEBUG!("Releasing acquired D-Bus name"); gio::bus_unown_name(bus_owner_id); } - // kill all running session - for pid in self.pids.drain(..) { - let _ = kill(pid, Signal::SIGINT); - } + self.drop_all_sessions(); DEBUG!("Removing signal handlers"); for signal_id in self.signals.drain(..) { signal_id.remove(); diff --git a/src/tests.rs b/src/tests.rs index 668d5bc..6b6dbbb 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -19,4 +19,5 @@ fn test_configuration_loading() { config.user_session_command(), "/usr/bin/diyac -x /usr/bin/diya-shell" ); + assert_eq!(config.enable_multiple_session(), false); }