Expand hwutils, udev-shim, and redbear-sessiond system recipes

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-18 17:59:10 +01:00
parent f863872591
commit b029ab628f
12 changed files with 827 additions and 104 deletions
@@ -1,67 +1,42 @@
use std::sync::atomic::{AtomicBool, Ordering};
use std::time::Duration;
use zbus::Connection;
static SLEEP_ACTIVE: AtomicBool = AtomicBool::new(false);
static SHUTDOWN_FIRED: AtomicBool = AtomicBool::new(false);
#[cfg(target_os = "redox")]
const KSTOP_PATH: &str = "/scheme/kernel.acpi/kstop";
const ACPI_SLEEP_PATH: &str = "/scheme/acpi/sleep";
const ACPI_SHUTDOWN_PATH: &str = "/scheme/acpi/shutdown";
const POLL_INTERVAL: Duration = Duration::from_secs(5);
#[cfg(target_os = "redox")]
fn wait_for_shutdown_edge() -> std::io::Result<()> {
use std::io::Read;
fn read_acpi_flag(path: &str) -> bool {
match std::fs::read_to_string(path) {
Ok(content) => {
let trimmed = content.trim().to_lowercase();
!trimmed.is_empty() && trimmed != "0"
}
Err(_) => false,
}
let mut file = std::fs::File::open(KSTOP_PATH)?;
let mut byte = [0_u8; 1];
let _ = file.read(&mut byte)?;
Ok(())
}
pub async fn watch_and_emit(connection: Connection) {
loop {
tokio::time::sleep(POLL_INTERVAL).await;
let sleep_now = tokio::task::spawn_blocking(|| read_acpi_flag(ACPI_SLEEP_PATH))
.await
.unwrap_or(false);
let was_sleeping = SLEEP_ACTIVE.load(Ordering::Relaxed);
if sleep_now && !was_sleeping {
SLEEP_ACTIVE.store(true, Ordering::Relaxed);
let _ = connection.emit_signal(
None::<&str>,
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"PrepareForSleep",
&true,
).await;
} else if !sleep_now && was_sleeping {
SLEEP_ACTIVE.store(false, Ordering::Relaxed);
let _ = connection.emit_signal(
None::<&str>,
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"PrepareForSleep",
&false,
).await;
#[cfg(target_os = "redox")]
match tokio::task::spawn_blocking(wait_for_shutdown_edge).await {
Ok(Ok(())) => {
let _ = connection
.emit_signal(
None::<&str>,
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"PrepareForShutdown",
&true,
)
.await;
}
let shutdown_now = tokio::task::spawn_blocking(|| read_acpi_flag(ACPI_SHUTDOWN_PATH))
.await
.unwrap_or(false);
if shutdown_now && !SHUTDOWN_FIRED.load(Ordering::Relaxed) {
SHUTDOWN_FIRED.store(true, Ordering::Relaxed);
let _ = connection.emit_signal(
None::<&str>,
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"PrepareForShutdown",
&true,
).await;
Ok(Err(err)) => {
eprintln!("redbear-sessiond: ACPI shutdown watcher failed: {err}");
}
Err(err) => {
eprintln!("redbear-sessiond: ACPI shutdown watcher task failed: {err}");
}
}
#[cfg(not(target_os = "redox"))]
{
let _ = connection;
}
}