diff --git a/.omo/run-continuation/ses_06694b995ffewJACilklGlbtw7.json b/.omo/run-continuation/ses_06694b995ffewJACilklGlbtw7.json index 0fac9a2252..1a705c7a28 100644 --- a/.omo/run-continuation/ses_06694b995ffewJACilklGlbtw7.json +++ b/.omo/run-continuation/ses_06694b995ffewJACilklGlbtw7.json @@ -1,10 +1,10 @@ { "sessionID": "ses_06694b995ffewJACilklGlbtw7", - "updatedAt": "2026-07-28T02:34:21.654Z", + "updatedAt": "2026-07-28T07:54:29.292Z", "sources": { "background-task": { "state": "idle", - "updatedAt": "2026-07-28T02:34:21.654Z" + "updatedAt": "2026-07-28T07:54:29.292Z" } } } \ No newline at end of file diff --git a/local/recipes/drivers/redbear-btusb/source/src/main.rs b/local/recipes/drivers/redbear-btusb/source/src/main.rs index 18347b53de..ff7623c28f 100644 --- a/local/recipes/drivers/redbear-btusb/source/src/main.rs +++ b/local/recipes/drivers/redbear-btusb/source/src/main.rs @@ -17,6 +17,7 @@ use hci::{cmd_read_bd_addr, cmd_read_local_version, cmd_reset, parse_read_bd_add use usb_transport::UsbHciTransport; #[cfg(target_os = "redox")] use usb_transport::{StubTransport, UsbTransportConfig}; +use log::{error, info}; const STATUS_FRESHNESS_SECS: u64 = 90; const BLUETOOTH_USB_CLASS: u8 = 0xE0; @@ -478,13 +479,14 @@ fn execute(command: Command, config: &TransportConfig) -> CommandOutcome { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); let args = std::env::args().skip(1).collect::>(); let config = TransportConfig::from_env(); let command = match parse_command(&args) { Ok(command) => command, Err(err) => { - eprintln!("redbear-btusb: {err}"); + log::error!("redbear-btusb: {err}")); process::exit(1); } }; @@ -495,7 +497,7 @@ fn main() { } CommandOutcome::RunDaemon => { if let Err(err) = daemon_main(&config) { - eprintln!("redbear-btusb: {err}"); + log::error!("redbear-btusb: {err}")); process::exit(1); } } diff --git a/local/recipes/drivers/redbear-iwlwifi/source/Cargo.toml b/local/recipes/drivers/redbear-iwlwifi/source/Cargo.toml index f73bc9f384..093c60429e 100644 --- a/local/recipes/drivers/redbear-iwlwifi/source/Cargo.toml +++ b/local/recipes/drivers/redbear-iwlwifi/source/Cargo.toml @@ -12,6 +12,7 @@ path = "src/main.rs" [dependencies] log = { version = "0.4", features = ["std"] } +env_logger = "0.11" thiserror = "2" redox-driver-sys = { path = "../../redox-driver-sys/source" } linux-kpi = { path = "../../linux-kpi/source" } diff --git a/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs b/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs index 299a3eae7b..58f0774ada 100644 --- a/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs +++ b/local/recipes/drivers/redbear-iwlwifi/source/src/main.rs @@ -19,6 +19,7 @@ use pcid_interface::PciFunctionHandle; #[cfg(target_os = "redox")] use linux_kpi::firmware::{release_firmware, request_firmware, Firmware}; +use log::{error, info}; #[repr(C)] #[derive(Default)] @@ -167,6 +168,7 @@ const IWL_CSR_RESET_REG_FLAG_SW_RESET: u32 = 0x00000080; const IWL_CSR_GP_CNTRL_REG_FLAG_INIT_DONE: u32 = 0x00000004; fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); let mut args = env::args().skip(1); let firmware_root = env::var_os("REDBEAR_IWLWIFI_FIRMWARE_ROOT") .map(PathBuf::from) @@ -175,7 +177,7 @@ fn main() { Some("--probe") => match detect_candidates(&firmware_root) { Ok(candidates) => print_candidates(&candidates), Err(err) => { - eprintln!("redbear-iwlwifi: probe failed: {err}"); + log::error!("redbear-iwlwifi: probe failed: {err}")); std::process::exit(1); } }, @@ -231,7 +233,7 @@ fn main() { Some("--daemon") => { let target = args.next().or_else(daemon_target_from_env); run_device_action(&firmware_root, target.clone(), full_init_candidate, "daemon-init"); - eprintln!("redbear-iwlwifi: init complete, starting datapath bridge"); + log::info!("redbear-iwlwifi: init complete, starting datapath bridge")); // Initialize the Wi-Fi datapath bridge let bridge = std::sync::Arc::new(std::sync::Mutex::new( @@ -255,7 +257,7 @@ fn main() { Some("--daemon-target") => match daemon_target_from_env() { Some(target) => println!("daemon_target={target}"), None => { - eprintln!( + log::error!(); "redbear-iwlwifi: no daemon target — set PCID_CLIENT_CHANNEL \ (channel contract) or PCID_DEVICE_PATH (legacy CLI)" ); @@ -275,7 +277,7 @@ fn main() { run_device_action(&firmware_root, target, retry_candidate, "retry") } _ => { - eprintln!( + log::error!(); "redbear-iwlwifi: use --probe, --status , --prepare , --transport-probe , --init-transport , --activate-nic , --scan , --connect [key], --disconnect , --full-init , --daemon [device], --daemon-target, --irq-test , --dma-test , or --retry " ); std::process::exit(1); @@ -338,7 +340,7 @@ fn daemon_target_from_env() -> Option { // Channel mode requires the pcid channel fd, which only exists // on Redox. If we reach here on the host it's a misconfiguration. let _ = channel; - eprintln!( + log::error!(); "redbear-iwlwifi: PCID_CLIENT_CHANNEL is set but channel mode \ requires the Redox target — refusing to fall back to \ PCID_DEVICE_PATH" @@ -385,33 +387,33 @@ fn run_connect_action( let candidate = match select_candidate(candidates, target.as_deref()) { Ok(candidate) => candidate, Err(err) => { - eprintln!("redbear-iwlwifi: connect selection failed: {err}"); + log::error!("redbear-iwlwifi: connect selection failed: {err}")); std::process::exit(1); } }; match connect_candidate(&candidate, firmware_root, ssid, security, key) { Ok(lines) => { for line in lines { - println!("{line}"); + log::info!("{line}")); } } Err(err) => { - eprintln!("redbear-iwlwifi: connect failed: {err}"); + log::error!("redbear-iwlwifi: connect failed: {err}")); std::process::exit(1); } } } Err(err) => { - eprintln!("redbear-iwlwifi: connect probe failed: {err}"); + log::error!("redbear-iwlwifi: connect probe failed: {err}")); std::process::exit(1); } } } fn print_candidates(candidates: &[Candidate]) { - println!("candidates={}", candidates.len()); + log::info!("candidates={}", candidates.len())); for candidate in candidates { - println!( + log::info!(); "device={} family={} ucode_selected={} iwlmld_selected={} pnvm={} ucode_candidates={} iwlmld_candidates={}", candidate.location, candidate.family, @@ -445,24 +447,24 @@ fn run_device_action( let candidate = match select_candidate(candidates, target.as_deref()) { Ok(candidate) => candidate, Err(err) => { - eprintln!("redbear-iwlwifi: {action_name} selection failed: {err}"); + log::error!("redbear-iwlwifi: {action_name} selection failed: {err}")); std::process::exit(1); } }; match action(&candidate, firmware_root) { Ok(lines) => { for line in lines { - println!("{line}"); + log::info!("{line}")); } } Err(err) => { - eprintln!("redbear-iwlwifi: {action_name} failed: {err}"); + log::error!("redbear-iwlwifi: {action_name} failed: {err}")); std::process::exit(1); } } } Err(err) => { - eprintln!("redbear-iwlwifi: {action_name} probe failed: {err}"); + log::error!("redbear-iwlwifi: {action_name} probe failed: {err}")); std::process::exit(1); } } diff --git a/local/recipes/system/redbear-acmd/Cargo.toml b/local/recipes/system/redbear-acmd/Cargo.toml index a808aa40c4..7858ee6361 100644 --- a/local/recipes/system/redbear-acmd/Cargo.toml +++ b/local/recipes/system/redbear-acmd/Cargo.toml @@ -1,3 +1,22 @@ [workspace] members = ["source"] resolver = "3" + +[workspace.package] +version = "0.3.1" +edition = "2024" +license = "MIT" +repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" +rust-version = "1.89" + +[workspace.dependencies] +log = "0.4" +redox_syscall = { path = "../../../sources/syscall" } +libredox = { path = "../../../sources/libredox" } +redox-scheme = { path = "../../../sources/redox-scheme" } +xhcid = { path = "../../../sources/base/drivers/usb/xhcid" } +common = { path = "../../../sources/base/drivers/common" } + +[profile.release] +opt-level = 3 +lto = "thin" diff --git a/local/recipes/system/redbear-acmd/source/Cargo.toml b/local/recipes/system/redbear-acmd/source/Cargo.toml index 943b97b78a..fa49bd11cf 100644 --- a/local/recipes/system/redbear-acmd/source/Cargo.toml +++ b/local/recipes/system/redbear-acmd/source/Cargo.toml @@ -1,22 +1,22 @@ [package] name = "redbear-acmd" -version = "0.3.1" -description = "ACPI management daemon for Red Bear OS" -repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" -license = "MIT" -edition = "2024" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +description = "USB CDC ACM serial class driver daemon" [[bin]] name = "redbear-acmd" path = "src/main.rs" [dependencies] -log = "0.4" -redox_syscall = { path = "../../../../../local/sources/syscall" } -redox-scheme = { path = "../../../../../local/sources/redox-scheme", package = "redox-scheme" } -xhcid = { path = "../../../../../local/sources/base/drivers/usb/xhcid" } -common = { path = "../../../../../local/sources/base/drivers/common" } -libredox = { path = "../../../../../local/sources/libredox", features = ["call", "std"] } +log = { workspace = true } +redox_syscall = { workspace = true } +redox-scheme = { workspace = true } +xhcid = { workspace = true } +common = { workspace = true } +libredox = { workspace = true } [patch.crates-io] redox_syscall = { path = "../../../../../local/sources/syscall" } diff --git a/local/recipes/system/redbear-authd/source/Cargo.lock b/local/recipes/system/redbear-authd/source/Cargo.lock index 1d091667fd..15914a85f0 100644 --- a/local/recipes/system/redbear-authd/source/Cargo.lock +++ b/local/recipes/system/redbear-authd/source/Cargo.lock @@ -2,6 +2,65 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -26,6 +85,12 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "blake2b_simd" version = "1.0.4" @@ -58,6 +123,12 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + [[package]] name = "constant_time_eq" version = "0.4.2" @@ -97,6 +168,37 @@ dependencies = [ "cmov", ] +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + [[package]] name = "digest" version = "0.11.3" @@ -107,6 +209,29 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + [[package]] name = "hybrid-array" version = "0.4.13" @@ -116,18 +241,66 @@ dependencies = [ "typenum", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jiff" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e184d09547b80eb7e20d141ba2fb1fbac843ca53f4cf1b31210adc4c1adc6e16" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323da076b7a6faf914dc677cb05a4b907742ff7375c8322c9e7f5061e5e0e9de" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "libc" version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + [[package]] name = "mcf" version = "0.6.0" @@ -143,12 +316,33 @@ version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "password-hash" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aab41826031698d6ffcd9cff78ef56ef998e39dc7e5067cdfebe373842d4723b" +[[package]] +name = "portable-atomic" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -171,6 +365,8 @@ dependencies = [ name = "redbear-authd" version = "0.3.1" dependencies = [ + "env_logger", + "log", "redbear-login-protocol", "rust-argon2", "serde", @@ -186,6 +382,35 @@ dependencies = [ "serde_json", ] +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + [[package]] name = "rust-argon2" version = "3.0.0" @@ -225,7 +450,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.118", ] [[package]] @@ -276,6 +501,37 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + [[package]] name = "typenum" version = "1.20.1" @@ -288,6 +544,27 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "zmij" version = "1.0.21" diff --git a/local/recipes/system/redbear-authd/source/Cargo.toml b/local/recipes/system/redbear-authd/source/Cargo.toml index 27122bc88c..9a92cbe521 100644 --- a/local/recipes/system/redbear-authd/source/Cargo.toml +++ b/local/recipes/system/redbear-authd/source/Cargo.toml @@ -11,6 +11,8 @@ name = "redbear-authd" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" redbear-login-protocol = { path = "../../redbear-login-protocol/source" } rust-argon2 = "3" serde = { version = "1", features = ["derive"] } diff --git a/local/recipes/system/redbear-authd/source/src/main.rs b/local/recipes/system/redbear-authd/source/src/main.rs index 43b1459371..5e551bff3f 100644 --- a/local/recipes/system/redbear-authd/source/src/main.rs +++ b/local/recipes/system/redbear-authd/source/src/main.rs @@ -1,4 +1,5 @@ use std::{ +use log::{error, info, warn}; collections::HashMap, env, fs, @@ -202,7 +203,7 @@ fn verify_password(account: &Account, password: &str) -> bool { match verify_shadow_password(password, &account.password) { Ok(ok) => return ok, Err(VerifyError::UnsupportedHashFormat) => { - eprintln!( + log::error!(); "redbear-authd: password hash for user {} uses an unsupported shadow format", account.username ); @@ -479,7 +480,7 @@ fn run() -> Result<(), String> { match parse_args() { Ok(()) => {} Err(err) if err.is_empty() => { - println!("{}", usage()); + log::info!("{}", usage())); return Ok(()); } Err(err) => return Err(err), @@ -496,7 +497,7 @@ fn run() -> Result<(), String> { .map_err(|err| format!("failed to set permissions on {AUTH_SOCKET_PATH}: {err}"))?; let state = RuntimeState::default(); - eprintln!("redbear-authd: listening on {AUTH_SOCKET_PATH}"); + log::info!("redbear-authd: listening on {AUTH_SOCKET_PATH}")); for stream in listener.incoming() { match stream { Ok(stream) => handle_connection(stream, state.clone()), @@ -508,9 +509,10 @@ fn run() -> Result<(), String> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { - eprintln!("redbear-authd: {err}"); - eprintln!("{}", usage()); + log::error!("redbear-authd: {err}")); + log::error!("{}", usage())); process::exit(1); } } diff --git a/local/recipes/system/redbear-btctl/source/src/main.rs b/local/recipes/system/redbear-btctl/source/src/main.rs index 803f96d636..a852176c28 100644 --- a/local/recipes/system/redbear-btctl/source/src/main.rs +++ b/local/recipes/system/redbear-btctl/source/src/main.rs @@ -9,6 +9,7 @@ use std::fs; #[cfg(target_os = "redox")] use std::os::fd::RawFd; use std::process; +use anyhow::Context as _; #[cfg(not(target_os = "redox"))] use backend::connection_state_lines; @@ -412,7 +413,7 @@ fn execute(args: &[String], backend: &mut dyn Backend) -> Result, } } -fn main() { +fn main() -> anyhow::Result<()> { let log_level = match env::var("REDBEAR_BTCTL_LOG").as_deref() { Ok("debug") => LevelFilter::Debug, Ok("trace") => LevelFilter::Trace, @@ -432,15 +433,13 @@ fn main() { } Ok(None) => {} Err(err) => { - eprintln!("redbear-btctl: {err}"); - process::exit(1); + return Err(anyhow::anyhow!("redbear-btctl: {err}")); } } #[cfg(not(target_os = "redox"))] { - eprintln!("redbear-btctl: daemon mode is only supported on Redox; use --probe on host"); - process::exit(1); + return Err(anyhow::anyhow!("redbear-btctl: daemon mode is only supported on Redox; use --probe on host")); } #[cfg(target_os = "redox")] @@ -457,13 +456,10 @@ fn main() { let mut state = redox_scheme::scheme::SchemeState::new(); notify_scheme_ready(notify_fd, &socket, &mut scheme); - match libredox::call::setrens(0, 0) { - Ok(_) => info!("redbear-btctl: registered scheme:btctl"), - Err(err) => { - error!("redbear-btctl: failed to enter null namespace: {err}"); - process::exit(1); - } + if let Err(err) = libredox::call::setrens(0, 0) { + return Err(anyhow::anyhow!("redbear-btctl: failed to enter null namespace: {err}")); } + info!("redbear-btctl: registered scheme:btctl"); let mut exit_code = 0; loop { @@ -492,7 +488,10 @@ fn main() { } } - process::exit(exit_code); + if exit_code != 0 { + return Err(anyhow::anyhow!("redbear-btctl: daemon exited with code {exit_code}")); + } + Ok(()) } } diff --git a/local/recipes/system/redbear-dnsd/source/src/main.rs b/local/recipes/system/redbear-dnsd/source/src/main.rs index 393cf9971e..658e61aaa2 100644 --- a/local/recipes/system/redbear-dnsd/source/src/main.rs +++ b/local/recipes/system/redbear-dnsd/source/src/main.rs @@ -108,7 +108,7 @@ fn start_loopback_listener() -> thread::JoinHandle<()> { if let Ok(response) = transport::send_query(&config, &query) { let reply = response.compile(); if let Err(e) = socket.send_to(&reply, &src) { - eprintln!("dnsd: loopback send_to({}) failed: {e}", src); + log::error!("dnsd: loopback send_to({}) failed: {e}", src)); } } } diff --git a/local/recipes/system/redbear-ecmd/Cargo.toml b/local/recipes/system/redbear-ecmd/Cargo.toml index a808aa40c4..7858ee6361 100644 --- a/local/recipes/system/redbear-ecmd/Cargo.toml +++ b/local/recipes/system/redbear-ecmd/Cargo.toml @@ -1,3 +1,22 @@ [workspace] members = ["source"] resolver = "3" + +[workspace.package] +version = "0.3.1" +edition = "2024" +license = "MIT" +repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" +rust-version = "1.89" + +[workspace.dependencies] +log = "0.4" +redox_syscall = { path = "../../../sources/syscall" } +libredox = { path = "../../../sources/libredox" } +redox-scheme = { path = "../../../sources/redox-scheme" } +xhcid = { path = "../../../sources/base/drivers/usb/xhcid" } +common = { path = "../../../sources/base/drivers/common" } + +[profile.release] +opt-level = 3 +lto = "thin" diff --git a/local/recipes/system/redbear-ecmd/source/Cargo.toml b/local/recipes/system/redbear-ecmd/source/Cargo.toml index 56f561e2d1..0769286915 100644 --- a/local/recipes/system/redbear-ecmd/source/Cargo.toml +++ b/local/recipes/system/redbear-ecmd/source/Cargo.toml @@ -1,24 +1,24 @@ [package] name = "redbear-ecmd" -version = "0.3.1" -description = "Embedded controller management daemon for Red Bear OS" -repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" -license = "MIT" -edition = "2024" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +description = "USB CDC ECM Ethernet network driver daemon" [[bin]] name = "redbear-ecmd" path = "src/main.rs" [dependencies] -log = "0.4" -redox_syscall = { path = "../../../../../local/sources/syscall" } -xhcid = { path = "../../../../../local/sources/base/drivers/usb/xhcid" } -common = { path = "../../../../../local/sources/base/drivers/common" } -libredox = { path = "../../../../../local/sources/libredox", features = ["call", "std"] } +log = { workspace = true } +redox_syscall = { workspace = true } +xhcid = { workspace = true } +common = { workspace = true } +libredox = { workspace = true } [target.'cfg(target_os = "redox")'.dependencies] -redox-scheme = { path = "../../../../../local/sources/redox-scheme" } +redox-scheme = { workspace = true } [patch.crates-io] redox_syscall = { path = "../../../../../local/sources/syscall" } diff --git a/local/recipes/system/redbear-ftdi/Cargo.toml b/local/recipes/system/redbear-ftdi/Cargo.toml index a808aa40c4..7858ee6361 100644 --- a/local/recipes/system/redbear-ftdi/Cargo.toml +++ b/local/recipes/system/redbear-ftdi/Cargo.toml @@ -1,3 +1,22 @@ [workspace] members = ["source"] resolver = "3" + +[workspace.package] +version = "0.3.1" +edition = "2024" +license = "MIT" +repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" +rust-version = "1.89" + +[workspace.dependencies] +log = "0.4" +redox_syscall = { path = "../../../sources/syscall" } +libredox = { path = "../../../sources/libredox" } +redox-scheme = { path = "../../../sources/redox-scheme" } +xhcid = { path = "../../../sources/base/drivers/usb/xhcid" } +common = { path = "../../../sources/base/drivers/common" } + +[profile.release] +opt-level = 3 +lto = "thin" diff --git a/local/recipes/system/redbear-ftdi/source/Cargo.toml b/local/recipes/system/redbear-ftdi/source/Cargo.toml index 1afcb81821..92e4679143 100644 --- a/local/recipes/system/redbear-ftdi/source/Cargo.toml +++ b/local/recipes/system/redbear-ftdi/source/Cargo.toml @@ -1,24 +1,24 @@ [package] name = "redbear-ftdi" -version = "0.3.1" -description = "FTDI USB serial driver for Red Bear OS" -repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" -license = "MIT" -edition = "2024" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +description = "FTDI FT232 USB-serial driver daemon" [[bin]] name = "redbear-ftdi" path = "src/main.rs" [dependencies] -log = "0.4" -redox_syscall = { path = "../../../../../local/sources/syscall" } -xhcid = { path = "../../../../../local/sources/base/drivers/usb/xhcid" } -common = { path = "../../../../../local/sources/base/drivers/common" } -libredox = { path = "../../../../../local/sources/libredox", features = ["call", "std"] } +log = { workspace = true } +redox_syscall = { workspace = true } +xhcid = { workspace = true } +common = { workspace = true } +libredox = { workspace = true } [target.'cfg(target_os = "redox")'.dependencies] -redox-scheme = { path = "../../../../../local/sources/redox-scheme" } +redox-scheme = { workspace = true } [patch.crates-io] redox_syscall = { path = "../../../../../local/sources/syscall" } diff --git a/local/recipes/system/redbear-greeter/source/Cargo.toml b/local/recipes/system/redbear-greeter/source/Cargo.toml index a3ab14ed59..fa995e4855 100644 --- a/local/recipes/system/redbear-greeter/source/Cargo.toml +++ b/local/recipes/system/redbear-greeter/source/Cargo.toml @@ -11,6 +11,8 @@ name = "redbear-greeterd" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" libc = "0.2" redbear-login-protocol = { path = "../../redbear-login-protocol/source" } serde = { version = "1", features = ["derive"] } diff --git a/local/recipes/system/redbear-greeter/source/src/main.rs b/local/recipes/system/redbear-greeter/source/src/main.rs index fff70d7750..9a418ec785 100644 --- a/local/recipes/system/redbear-greeter/source/src/main.rs +++ b/local/recipes/system/redbear-greeter/source/src/main.rs @@ -1,4 +1,5 @@ use std::{ +use log::{error, info, warn}; env, fs, io::{self, BufRead, BufReader, Write}, @@ -277,7 +278,7 @@ impl GreeterDaemon { if attempt == 0 { return Ok(()); } - eprintln!( + log::error!(); "redbear-greeterd: wayland socket appeared after {}ms (primary={}, fallback={})", attempt * 250, socket_path.display(), @@ -286,7 +287,7 @@ impl GreeterDaemon { return Ok(()); } if attempt % 20 == 0 && attempt > 0 { - eprintln!( + log::error!(); "redbear-greeterd: still waiting for compositor socket {} ({}s elapsed)", socket_path.display(), attempt / 4 @@ -303,28 +304,28 @@ impl GreeterDaemon { fn start_surface(&mut self) -> Result<(), String> { self.set_state(GreeterState::Starting, "Starting greeter surface"); - println!("redbear-greeterd: starting compositor ({})...", COMPOSITOR_BIN_PATH); + log::info!("redbear-greeterd: starting compositor ({})...", COMPOSITOR_BIN_PATH)); let compositor_path = if Path::new(COMPOSITOR_BIN_PATH).is_file() { COMPOSITOR_BIN_PATH } else { COMPOSITOR_SHARE_PATH }; self.compositor = Some(self.spawn_as_greeter(compositor_path)?); - println!("redbear-greeterd: waiting for Wayland socket..."); + log::info!("redbear-greeterd: waiting for Wayland socket...")); self.wait_for_wayland_socket()?; - println!("redbear-greeterd: compositor ready, launching greeter UI..."); + log::info!("redbear-greeterd: compositor ready, launching greeter UI...")); self.ui = Some(self.spawn_as_greeter("/usr/bin/redbear-greeter-ui")?); - println!("redbear-greeterd: greeter UI launched, activating VT {}", self.vt); + log::info!("redbear-greeterd: greeter UI launched, activating VT {}", self.vt)); self.activate_vt(self.vt)?; self.set_state(GreeterState::GreeterReady, "Ready"); - println!("redbear-greeterd: greeter ready on VT {}", self.vt); + log::info!("redbear-greeterd: greeter ready on VT {}", self.vt)); Ok(()) } fn kill_child(child: &mut Option) { if let Some(process) = child.as_mut() { if let Err(e) = process.kill() { - eprintln!("redbear-greeterd: kill failed: {e}"); + log::error!("redbear-greeterd: kill failed: {e}")); } match process.wait() { Ok(status) => eprintln!("redbear-greeterd: child exited with {status}"), @@ -514,7 +515,7 @@ impl GreeterDaemon { match self.listener.accept() { Ok((stream, _)) => { if let Err(err) = self.handle_connection(stream) { - eprintln!("redbear-greeterd: {err}"); + log::error!("redbear-greeterd: {err}")); } } Err(err) if err.kind() == io::ErrorKind::WouldBlock => { @@ -530,7 +531,7 @@ fn run() -> Result<(), String> { match parse_args() { Ok(()) => {} Err(err) if err.is_empty() => { - println!("{}", usage()); + log::info!("{}", usage())); return Ok(()); } Err(err) => return Err(err), @@ -541,9 +542,10 @@ fn run() -> Result<(), String> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { - eprintln!("redbear-greeterd: {err}"); - eprintln!("{}", usage()); + log::error!("redbear-greeterd: {err}")); + log::error!("{}", usage())); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/Cargo.toml b/local/recipes/system/redbear-hwutils/source/Cargo.toml index 8d2d77dca7..ee51fb55c6 100644 --- a/local/recipes/system/redbear-hwutils/source/Cargo.toml +++ b/local/recipes/system/redbear-hwutils/source/Cargo.toml @@ -154,6 +154,8 @@ orbclient = "0.3" redox-driver-sys = { path = "../../../drivers/redox-driver-sys/source" } libredox = { path = "../../../../../local/sources/libredox" } syscall = { path = "../../../../../local/sources/syscall", package = "redox_syscall", features = ["std"] } +log = "0.4" +env_logger = "0.11" [patch.crates-io] libredox = { path = "../../../../../local/sources/libredox" } redox_syscall = { path = "../../../../../local/sources/syscall" } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/cmdline.rs b/local/recipes/system/redbear-hwutils/source/src/bin/cmdline.rs index af6ddbe959..339e182203 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/cmdline.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/cmdline.rs @@ -1,7 +1,9 @@ use std::env; use std::fs; +use log; fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); let args: Vec = env::args().collect(); // Read /scheme/sys/env for cmdline parameters @@ -14,7 +16,7 @@ fn main() { .map(|(k, v)| format!("{}={}", k.trim_start_matches("CMDLINE_"), v)) .collect(); if vars.is_empty() { - eprintln!("cmdline: no parameters found"); + log::error!("cmdline: no parameters found"); return; } vars.join("\n") @@ -31,7 +33,7 @@ fn main() { } } } - eprintln!("cmdline: {} not found", key); + log::error!("cmdline: {} not found", key); std::process::exit(1); } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/evtest-rbos.rs b/local/recipes/system/redbear-hwutils/source/src/bin/evtest-rbos.rs index 3fb8a0140e..2300b07622 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/evtest-rbos.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/evtest-rbos.rs @@ -4,6 +4,7 @@ use std::process; use std::time::{Duration, Instant}; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-evtest"; const USAGE: &str = "Usage: redbear-evtest\n\nRead the first keyboard event from the udev-backed evdev consumer path and print it."; @@ -72,8 +73,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/input-inject-rbos.rs b/local/recipes/system/redbear-hwutils/source/src/bin/input-inject-rbos.rs index b1c622a67d..e0896d7e93 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/input-inject-rbos.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/input-inject-rbos.rs @@ -5,6 +5,7 @@ use std::time::{Duration, Instant}; use orbclient::{K_A, KeyEvent}; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-input-inject"; const USAGE: &str = "Usage: redbear-input-inject\n\nInject a synthetic 'A' key press/release through /scheme/input/producer and verify the first evdev consumer event."; @@ -98,8 +99,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/lspci.rs b/local/recipes/system/redbear-hwutils/source/src/bin/lspci.rs index 04468b3f77..45702ff076 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/lspci.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/lspci.rs @@ -7,6 +7,7 @@ use redbear_hwutils::{ }; use redox_driver_sys::pci::{InterruptSupport, PciDeviceInfo, parse_device_info_from_config_space}; use redox_driver_sys::quirks::{PciQuirkFlags, lookup_pci_quirks}; +use log; const USAGE: &str = "Usage: lspci\nList PCI devices exposed by /scheme/pci."; @@ -28,11 +29,12 @@ struct PciDeviceSummary { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); match run() { Ok(()) => {} Err(err) if err.is_empty() => {} Err(err) => { - eprintln!("lspci: {err}"); + log::error!("lspci: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/lsusb.rs b/local/recipes/system/redbear-hwutils/source/src/bin/lsusb.rs index b95e7b73c7..bd9ba9900d 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/lsusb.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/lsusb.rs @@ -6,6 +6,7 @@ use std::str::FromStr; use redbear_hwutils::{describe_usb_device, parse_args}; use redox_driver_sys::quirks::{UsbQuirkFlags, lookup_usb_quirks}; use serde::Deserialize; +use log; const USAGE: &str = "Usage: lsusb\nList USB devices exposed by native usb.* schemes."; @@ -150,11 +151,12 @@ impl DevDesc { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); match run() { Ok(()) => {} Err(err) if err.is_empty() => {} Err(err) => { - eprintln!("lsusb: {err}"); + log::error!("lsusb: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-bluetooth-battery-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-bluetooth-battery-check.rs index 3f433e05c2..cce347eee5 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-bluetooth-battery-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-bluetooth-battery-check.rs @@ -5,6 +5,7 @@ use std::thread; use std::time::{Duration, Instant}; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-bluetooth-battery-check"; const USAGE: &str = "Usage: redbear-bluetooth-battery-check\n\nExercise the bounded Bluetooth Battery Level runtime slice inside a Red Bear OS guest or target runtime."; @@ -123,8 +124,9 @@ impl RuntimeSession { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-boot-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-boot-check.rs index 417c3908ef..75c74d032c 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-boot-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-boot-check.rs @@ -5,6 +5,7 @@ // and greeter service health. Follows Phase 1-5 check pattern. use std::process; +use log; const PROGRAM: &str = "redbear-boot-check"; const USAGE: &str = "Usage: redbear-boot-check [--json]\n\n\ @@ -161,7 +162,7 @@ impl Report { checks, }, ) { - eprintln!("{PROGRAM}: failed to serialize JSON: {err}"); + log::error!("{PROGRAM}: failed to serialize JSON: {err}"); } } } @@ -292,11 +293,12 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { if err.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-dns-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-dns-check.rs index 6aeb562a74..18b1df9e12 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-dns-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-dns-check.rs @@ -17,6 +17,7 @@ use std::io::{Read, Write}; use std::process; use std::thread; use std::time::{Duration, Instant}; +use log; const SCHEME_DNS: &str = "/scheme/dns"; @@ -364,12 +365,12 @@ fn test_concurrency(count: usize) -> Result<(), String> { passed += 1; } else { failed += 1; - eprintln!(" {}", msg); + log::error!(" {}", msg); } } Err(_) => { failed += 1; - eprintln!(" thread panicked"); + log::error!(" thread panicked"); } } } @@ -410,6 +411,7 @@ fn print_usage() { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); let args: Vec = env::args().skip(1).collect(); if args.is_empty() || args.iter().any(|a| a == "--help" || a == "-h") { @@ -430,7 +432,7 @@ fn main() { println!(" [PASS] {}\n", name); } Err(e) => { - eprintln!(" [FAIL] {}: {}\n", name, e); + log::error!(" [FAIL] {}: {}\n", name, e); } } }; diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-drm-display-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-drm-display-check.rs index 8461ce8c47..d7892c939e 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-drm-display-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-drm-display-check.rs @@ -3,6 +3,7 @@ use std::io::{Read, Write}; use std::mem::{MaybeUninit, size_of}; use std::path::Path; use std::process::{self}; +use log; const PROGRAM: &str = "redbear-drm-display-check"; const USAGE: &str = "Usage: redbear-drm-display-check --vendor amd|intel [--card /scheme/drm/card0] [--modeset CONNECTOR:MODE]\n\nBounded DRM/KMS display validation checker. This proves only display-path evidence, not render proof."; @@ -539,8 +540,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-firewall-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-firewall-check.rs index a0f4846e91..1321041c5f 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-firewall-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-firewall-check.rs @@ -45,6 +45,7 @@ use std::fs; use std::io::Write; use std::process; +use log; const NETFILTER: &str = "/scheme/netfilter"; const PROGRAM: &str = "redbear-firewall-check"; @@ -477,7 +478,7 @@ fn scenario_f_syn_flood() -> ScenarioResult { // The over_limit counter should be 0 at start (no traffic yet). // If it's non-zero, that's also acceptable — traffic may have // occurred before we ran this test. We just verify it exists. - eprintln!( + log::debug!( "SYNFlood: initial over_limit = {} (expected 0 or traffic residue)", initial_over_limit ); @@ -580,18 +581,19 @@ fn parse_args_inner( } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); // Parse arguments (accepts --help, rejects unknown). if let Err(e) = parse_args_inner(PROGRAM, USAGE, std::env::args()) { if e.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {e}"); + log::error!("{PROGRAM}: {e}"); process::exit(1); } // Pre-flight: verify we can access the netfilter scheme. if let Err(e) = require_root() { - eprintln!("{PROGRAM}: {e}"); + log::error!("{PROGRAM}: {e}"); process::exit(1); } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-greeter-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-greeter-check.rs index a738b6d769..5018838dd5 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-greeter-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-greeter-check.rs @@ -8,6 +8,7 @@ use std::{ }; use redbear_login_protocol::{GreeterRequest as Request, GreeterResponse}; +use log; const PROGRAM: &str = "redbear-greeter-check"; const USAGE: &str = "Usage: redbear-greeter-check [--invalid USER PASSWORD | --valid USER PASSWORD]\n\nQuery the installed Red Bear greeter surface inside the guest."; @@ -247,6 +248,7 @@ fn run_valid(username: &str, password: &str) -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); let mode = match parse_mode() { Ok(mode) => mode, Err(err) if err.is_empty() => { @@ -254,7 +256,7 @@ fn main() { process::exit(0); } Err(err) => { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); eprintln!("{USAGE}"); process::exit(1); } @@ -267,7 +269,7 @@ fn main() { }; if let Err(err) = result { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-acpi-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-acpi-check.rs index 8a91e33c71..1963581b83 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-acpi-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-acpi-check.rs @@ -5,6 +5,7 @@ use std::{ }; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase-acpi-check"; const USAGE: &str = "Usage: redbear-phase-acpi-check\n\nShow the bounded ACPI runtime surface inside the target runtime."; @@ -140,8 +141,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-dma-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-dma-check.rs index c9486a7e2f..4475ee5504 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-dma-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-dma-check.rs @@ -1,6 +1,7 @@ use std::process; use redox_driver_sys::dma::DmaBuffer; +use log; fn run() -> Result<(), String> { println!("=== Red Bear OS DMA Runtime Check ==="); @@ -40,8 +41,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("redbear-phase-dma-check: {err}"); + log::error!(");redbear-phase-dma-check: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-iommu-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-iommu-check.rs index c9a0ffcfc2..5cced14ba7 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-iommu-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-iommu-check.rs @@ -10,6 +10,7 @@ use std::{ }; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase-iommu-check"; const USAGE: &str = "Usage: redbear-phase-iommu-check\n\nShow the installed IOMMU validation surface inside the guest."; @@ -387,8 +388,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-pci-irq-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-pci-irq-check.rs index 99c81ae4b1..17a1b8662f 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-pci-irq-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-pci-irq-check.rs @@ -12,6 +12,7 @@ use redbear_hwutils::parse_args; #[cfg(target_os = "redox")] use redox_driver_sys::irq::IrqHandle; use redox_driver_sys::pci::{PciLocation, parse_device_info_from_config_space}; +use log; const PROGRAM: &str = "redbear-phase-pci-irq-check"; const USAGE: &str = "Usage: redbear-phase-pci-irq-check\n\nShow bounded live PCI/IRQ runtime reporting from the current target runtime."; @@ -422,8 +423,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-ps2-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-ps2-check.rs index 197ec75837..69b83dd4f5 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-ps2-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-ps2-check.rs @@ -6,6 +6,7 @@ use std::process::{self, Command}; use syscall::O_NONBLOCK; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase-ps2-check"; const USAGE: &str = "Usage: redbear-phase-ps2-check\n\nRun the bounded PS/2 and serio proof check inside the guest."; @@ -58,8 +59,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-timer-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-timer-check.rs index cae1b75ecd..1000abc9e0 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-timer-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase-timer-check.rs @@ -6,6 +6,7 @@ use std::time::Duration; use libredox::{Fd, flag}; use redbear_hwutils::parse_args; use syscall::data::TimeSpec; +use log; const PROGRAM: &str = "redbear-phase-timer-check"; const USAGE: &str = "Usage: redbear-phase-timer-check\n\nRun the bounded timer-source proof check inside the guest."; @@ -83,8 +84,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-drm-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-drm-check.rs index 16e35b1c47..54026f7974 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-drm-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-drm-check.rs @@ -6,6 +6,7 @@ use std::io::Read; #[cfg(target_os = "redox")] use std::path::Path; use std::process; +use log; const PROGRAM: &str = "redbear-phase1-drm-check"; const USAGE: &str = "Usage: redbear-phase1-drm-check [--json] [--verbose]\n\n\ @@ -180,7 +181,7 @@ impl Report { }; if let Err(err) = serde_json::to_writer(std::io::stdout(), &report) { - eprintln!("{PROGRAM}: failed to serialize JSON: {err}"); + log::error!("{PROGRAM}: failed to serialize JSON: {err}"); } } } @@ -331,11 +332,12 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { if err.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-evdev-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-evdev-check.rs index a20e7ed7e3..46126f1eda 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-evdev-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-evdev-check.rs @@ -14,6 +14,7 @@ use serde_json::json; #[cfg(target_os = "redox")] use syscall::O_NONBLOCK; +use log; const PROGRAM: &str = "redbear-phase1-evdev-check"; const USAGE: &str = "Usage: redbear-phase1-evdev-check [--keyboard] [--mouse] [--timeout SECS] [--json]\n\nValidate the bounded evdevd keyboard and mouse paths inside the Red Bear guest."; @@ -127,17 +128,18 @@ impl CheckStatus { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); match parse_args(std::env::args()) { Ok(config) => match run(&config) { Ok(success) => process::exit(if success { 0 } else { 1 }), Err(err) => { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } }, Err(err) if err.is_empty() => process::exit(0), Err(err) => { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } @@ -203,7 +205,7 @@ fn run(config: &Config) -> Result { "mouse_events": report.mouse_events, })) .map_err(|err| format!("failed to serialize JSON output: {err}"))?; - eprintln!("evdevd check requires Redox runtime"); + log::warn!("evdevd check requires Redox runtime"); println!("{payload}"); } else { println!("evdevd check requires Redox runtime"); diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-firmware-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-firmware-check.rs index 3e19134b6a..872a33e5f8 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-firmware-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-firmware-check.rs @@ -7,6 +7,7 @@ use std::io::Read; #[cfg(target_os = "redox")] use std::path::{Path, PathBuf}; use std::process; +use log; const PROGRAM: &str = "redbear-phase1-firmware-check"; const USAGE: &str = "Usage: redbear-phase1-firmware-check [--json] [--blob KEY]\n\n\ @@ -175,7 +176,7 @@ impl Report { }; if let Err(err) = serde_json::to_writer(std::io::stdout(), &report) { - eprintln!("{PROGRAM}: failed to serialize JSON: {err}"); + log::error!("{PROGRAM}: failed to serialize JSON: {err}"); } } } @@ -398,11 +399,12 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { if err.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-udev-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-udev-check.rs index e7a9d802bd..ca021bf8a8 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-udev-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase1-udev-check.rs @@ -4,6 +4,7 @@ use std::process; use std::{fs, io::Read}; use serde_json::json; +use log; const PROGRAM: &str = "redbear-phase1-udev-check"; const USAGE: &str = "Usage: redbear-phase1-udev-check [--keyboard] [--pointer] [--drm] [--json]\n\nValidate bounded udev-shim device enumeration inside the Red Bear guest."; @@ -47,17 +48,18 @@ impl CheckStatus { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); match parse_args(std::env::args()) { Ok(config) => match run(&config) { Ok(success) => process::exit(if success { 0 } else { 1 }), Err(err) => { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } }, Err(err) if err.is_empty() => process::exit(0), Err(err) => { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } @@ -112,7 +114,7 @@ fn run(config: &Config) -> Result { "drm_count": report.drm_count, })) .map_err(|err| format!("failed to serialize JSON output: {err}"))?; - eprintln!("udev-shim check requires Redox runtime"); + log::warn!("udev-shim check requires Redox runtime"); println!("{payload}"); } else { println!("udev-shim check requires Redox runtime"); diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase3-input-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase3-input-check.rs index a12a153bb7..ee6f53bdcf 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase3-input-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase3-input-check.rs @@ -1,6 +1,7 @@ use std::process::{self, Command}; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase3-input-check"; const USAGE: &str = @@ -31,8 +32,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase4-wayland-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase4-wayland-check.rs index 694cbba910..d1b76fdcef 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase4-wayland-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase4-wayland-check.rs @@ -5,6 +5,7 @@ use std::{ }; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase4-wayland-check"; const USAGE: &str = "Usage: redbear-phase4-wayland-check\n\nShow the installed Phase 4 Wayland launch surface inside the guest."; @@ -117,8 +118,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-cs-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-cs-check.rs index 62f0b4e730..9fe47d0cf1 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-cs-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-cs-check.rs @@ -3,6 +3,7 @@ // Does NOT claim real hardware render validation yet. use std::process; +use log; const PROGRAM: &str = "redbear-phase5-cs-check"; const USAGE: &str = "Usage: redbear-phase5-cs-check [--json]\n\n\ @@ -168,7 +169,7 @@ impl Report { checks, }, ) { - eprintln!("{PROGRAM}: failed to serialize JSON: {err}"); + log::error!("{PROGRAM}: failed to serialize JSON: {err}"); } } } @@ -676,11 +677,12 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { if err.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-gpu-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-gpu-check.rs index 4999e529d2..eb1c106c7a 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-gpu-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-gpu-check.rs @@ -10,6 +10,7 @@ use redbear_hwutils::{ }; #[cfg(target_os = "redox")] use redox_driver_sys::pci::parse_device_info_from_config_space; +use log; const PROGRAM: &str = "redbear-phase5-gpu-check"; const USAGE: &str = "Usage: redbear-phase5-gpu-check [--json]\n\n\ @@ -199,7 +200,7 @@ impl Report { checks, }, ) { - eprintln!("{PROGRAM}: failed to serialize JSON: {err}"); + log::error!("{PROGRAM}: failed to serialize JSON: {err}"); } } } @@ -683,11 +684,12 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { if err.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-network-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-network-check.rs index 486d178c71..e06db6ead0 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-network-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-network-check.rs @@ -7,6 +7,7 @@ use std::{ use redbear_hwutils::parse_args; use serde_json::Value; +use log; const PROGRAM: &str = "redbear-phase5-network-check"; const USAGE: &str = "Usage: redbear-phase5-network-check\n\nShow the installed Phase 5 networking/session plumbing surface inside the guest."; @@ -121,7 +122,7 @@ fn run_command_with_retry( Ok(output) => return Ok(output), Err(err) => { if attempt < max_attempts { - eprintln!( + log::warn!( "{label}: attempt {attempt}/{max_attempts} failed ({err}), retrying in {delay_secs}s..." ); std::thread::sleep(std::time::Duration::from_secs(delay_secs)); @@ -724,8 +725,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-analyze.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-analyze.rs index bf0d26fba5..d0ed49683b 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-analyze.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-analyze.rs @@ -3,6 +3,7 @@ use std::process; use redbear_hwutils::parse_args; use serde_json::Value; +use log; const PROGRAM: &str = "redbear-phase5-wifi-analyze"; const USAGE: &str = "Usage: redbear-phase5-wifi-analyze \n\nSummarize a Wi-Fi capture bundle into likely blocker categories."; @@ -101,8 +102,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-capture.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-capture.rs index df379befdb..0426b64f62 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-capture.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-capture.rs @@ -5,6 +5,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use redbear_hwutils::parse_args; use serde_json::json; +use log; const PROGRAM: &str = "redbear-phase5-wifi-capture"; const USAGE: &str = "Usage: redbear-phase5-wifi-capture [PROFILE] [INTERFACE] [OUTPUT_PATH]\n\nCapture the current bounded Intel Wi-Fi runtime surfaces into a single JSON bundle."; @@ -137,8 +138,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-check.rs index 40c0ac0d44..1a24bd5322 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-check.rs @@ -2,6 +2,7 @@ use std::path::Path; use std::process::{self, Command}; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase5-wifi-check"; const USAGE: &str = "Usage: redbear-phase5-wifi-check [PROFILE] [INTERFACE]\n\nExercise the bounded Intel Wi-Fi runtime path inside a Red Bear OS guest or target runtime. The packaged runtime path defaults to the bounded open-profile flow; WPA2-PSK remains implemented and host/unit-verified, but is not yet the default packaged runtime proof."; @@ -124,8 +125,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-link-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-link-check.rs index d46bf1347e..a26a818144 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-link-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-link-check.rs @@ -2,6 +2,7 @@ use std::process::{self, Command}; use redbear_hwutils::parse_args; use serde_json::Value; +use log; const PROGRAM: &str = "redbear-phase5-wifi-link-check"; const USAGE: &str = "Usage: redbear-phase5-wifi-link-check\n\nCheck whether the current runtime exposes Wi-Fi interface/address/route signals beyond the bounded lifecycle layer."; @@ -77,8 +78,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-run.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-run.rs index efe16456fb..74e0296ac0 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-run.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase5-wifi-run.rs @@ -1,6 +1,7 @@ use std::process::{self, Command}; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase5-wifi-run"; const USAGE: &str = "Usage: redbear-phase5-wifi-run [PROFILE] [INTERFACE] [OUTPUT_PATH]\n\nRun the packaged bounded Wi-Fi validator and then emit a JSON capture bundle."; @@ -70,8 +71,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase6-kde-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase6-kde-check.rs index dea3cd6db6..001857acdd 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase6-kde-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-phase6-kde-check.rs @@ -2,6 +2,7 @@ use std::path::Path; use std::process::{self, Command, Output}; use redbear_hwutils::parse_args; +use log; const PROGRAM: &str = "redbear-phase6-kde-check"; const USAGE: &str = "Usage: redbear-phase6-kde-check\n\nShow the installed Phase 6 KDE session surface inside the guest."; @@ -215,8 +216,9 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-check.rs index 93bba58c61..85f1b49c39 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-check.rs @@ -12,6 +12,7 @@ const USAGE: &str = "Usage: redbear-usb-check [--json]\n\n\ #[cfg(target_os = "redox")] use std::fs; +use log; #[derive(Clone, Copy, Debug, Eq, PartialEq)] enum CheckResult { @@ -173,7 +174,7 @@ impl Report { checks, }, ) { - eprintln!("{PROGRAM}: failed to serialize JSON: {err}"); + log::error!("{PROGRAM}: failed to serialize JSON: {err}"); } } } @@ -329,11 +330,12 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { if err.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-storage-check.rs b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-storage-check.rs index cfb995b307..bf90ec98f5 100644 --- a/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-storage-check.rs +++ b/local/recipes/system/redbear-hwutils/source/src/bin/redbear-usb-storage-check.rs @@ -12,6 +12,7 @@ const USAGE: &str = "Usage: redbear-usb-storage-check [--json]\n\n\ #[cfg(target_os = "redox")] use std::fs; +use log; const TEST_SECTOR: u64 = 2048; const SECTOR_SIZE: usize = 512; @@ -150,7 +151,7 @@ impl Report { checks, }, ) { - eprintln!("{PROGRAM}: failed to serialize JSON: {err}"); + log::error!("{PROGRAM}: failed to serialize JSON: {err}"); } } } @@ -462,11 +463,12 @@ fn run() -> Result<(), String> { } fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { if err.is_empty() { process::exit(0); } - eprintln!("{PROGRAM}: {err}"); + log::error!("{PROGRAM}: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-info/source/Cargo.toml b/local/recipes/system/redbear-info/source/Cargo.toml index 3d175290f5..7b26e73cd2 100644 --- a/local/recipes/system/redbear-info/source/Cargo.toml +++ b/local/recipes/system/redbear-info/source/Cargo.toml @@ -14,3 +14,5 @@ path = "src/main.rs" redox-driver-sys = { path = "../../../../recipes/drivers/redox-driver-sys/source" } serde_json = "1" toml = "0.8" +log = "0.4" +env_logger = "0.11" diff --git a/local/recipes/system/redbear-info/source/src/main.rs b/local/recipes/system/redbear-info/source/src/main.rs index 6b0971988f..3206adf3a6 100644 --- a/local/recipes/system/redbear-info/source/src/main.rs +++ b/local/recipes/system/redbear-info/source/src/main.rs @@ -12,6 +12,7 @@ use toml::Value; #[cfg(test)] use std::path::Path; +use log; const RESET: &str = "\x1b[0m"; const GREEN: &str = "\x1b[32m"; @@ -515,8 +516,9 @@ const INTEGRATIONS: &[IntegrationCheck] = &[ ]; fn main() { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); if let Err(err) = run() { - eprintln!("redbear-info: {err}"); + log::error!("redbear-info: {err}"); process::exit(1); } } diff --git a/local/recipes/system/redbear-mtr/source/Cargo.toml b/local/recipes/system/redbear-mtr/source/Cargo.toml index aeaec4ceb7..5f3cb9c1ce 100644 --- a/local/recipes/system/redbear-mtr/source/Cargo.toml +++ b/local/recipes/system/redbear-mtr/source/Cargo.toml @@ -11,5 +11,7 @@ name = "redbear-mtr" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" anyhow = "1" redbear-traceroute = { path = "../../redbear-traceroute/source" } diff --git a/local/recipes/system/redbear-mtr/source/src/main.rs b/local/recipes/system/redbear-mtr/source/src/main.rs index 1335140b7f..4a8d207b6d 100644 --- a/local/recipes/system/redbear-mtr/source/src/main.rs +++ b/local/recipes/system/redbear-mtr/source/src/main.rs @@ -1,5 +1,6 @@ use anyhow::{bail, Result}; use redbear_traceroute::{ +use log::{error, info, warn}; destination_port, format_reply_suffix, probe, resolve_destination, ProbeReply, }; use std::env; @@ -203,8 +204,9 @@ fn run() -> Result<()> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { - eprintln!("redbear-mtr: {err}"); + log::error!("redbear-mtr: {err}")); std::process::exit(1); } } diff --git a/local/recipes/system/redbear-netctl-console/source/Cargo.toml b/local/recipes/system/redbear-netctl-console/source/Cargo.toml index 15e10c8937..6b3d4aa3c8 100644 --- a/local/recipes/system/redbear-netctl-console/source/Cargo.toml +++ b/local/recipes/system/redbear-netctl-console/source/Cargo.toml @@ -15,5 +15,7 @@ name = "redbear-netctl-console" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" ratatui = { version = "0.30", default-features = false, features = ["termion"] } termion = "4" diff --git a/local/recipes/system/redbear-netctl-console/source/src/main.rs b/local/recipes/system/redbear-netctl-console/source/src/main.rs index f0bb3bf699..9c36877d6f 100644 --- a/local/recipes/system/redbear-netctl-console/source/src/main.rs +++ b/local/recipes/system/redbear-netctl-console/source/src/main.rs @@ -6,6 +6,7 @@ use termion::event::Key; use redbear_netctl_console::app::{App, Focus}; use redbear_netctl_console::backend::FsBackend; +use log::{error, info, warn}; #[link(name = "ncursesw")] unsafe extern "C" { @@ -25,12 +26,13 @@ unsafe extern "C" { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { // SAFETY: best-effort terminal restore on failure path. unsafe { let _ = endwin(); } - eprintln!("redbear-netctl-console: {err}"); + log::error!("redbear-netctl-console: {err}")); process::exit(1); } } diff --git a/local/recipes/system/redbear-netctl/source/Cargo.toml b/local/recipes/system/redbear-netctl/source/Cargo.toml index 95312b43a9..de069868dd 100644 --- a/local/recipes/system/redbear-netctl/source/Cargo.toml +++ b/local/recipes/system/redbear-netctl/source/Cargo.toml @@ -12,3 +12,8 @@ path = "src/main.rs" [dev-dependencies] redbear-netctl-console = { path = "../../redbear-netctl-console/source" } + +[dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" +anyhow = "1" diff --git a/local/recipes/system/redbear-netctl/source/src/main.rs b/local/recipes/system/redbear-netctl/source/src/main.rs index f0630f1820..bbaef69e48 100644 --- a/local/recipes/system/redbear-netctl/source/src/main.rs +++ b/local/recipes/system/redbear-netctl/source/src/main.rs @@ -2,8 +2,10 @@ use std::env; use std::fs; use std::path::PathBuf; use std::process::{self, Command}; +use anyhow::Context as _; use std::thread; use std::time::{Duration, Instant}; +use log::{error, info, warn}; fn program_name() -> String { env::args() @@ -60,11 +62,9 @@ struct Profile { ip_mode: ProfileIpMode, } -fn main() { - if let Err(err) = run() { - eprintln!("{}: {err}", program_name()); - process::exit(1); - } +fn main() -> anyhow::Result<()> { + run().map_err(|e| anyhow::anyhow!("{}", e))?; + Ok(()) } fn run() -> Result<(), String> { @@ -199,7 +199,7 @@ fn stop_profile(name: &str) -> Result<(), String> { } if active_profile_name()?.as_deref() == Some(name) { if let Err(e) = fs::remove_file(active_profile_path()) { - eprintln!("netctl: failed to remove active profile link: {e}"); + log::error!("netctl: failed to remove active profile link: {e}")); } } println!("stopped {}", name); @@ -224,7 +224,7 @@ fn disable_profile(profile: Option<&str>) -> Result<(), String> { } if let Err(e) = fs::remove_file(active_profile_path()) { - eprintln!("netctl: failed to remove active profile link: {e}"); + log::error!("netctl: failed to remove active profile link: {e}")); } println!("disabled {}", profile.unwrap_or("active")); Ok(()) diff --git a/local/recipes/system/redbear-netstat/redbear-netstat/source/Cargo.toml b/local/recipes/system/redbear-netstat/redbear-netstat/source/Cargo.toml deleted file mode 100644 index f5654d129e..0000000000 --- a/local/recipes/system/redbear-netstat/redbear-netstat/source/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "redbear-netstat" -version = "0.3.1" -edition = "2024" - -[[bin]] -name = "netstat" -path = "src/main.rs" - -[[bin]] -name = "redbear-netstat" -path = "src/main.rs" diff --git a/local/recipes/system/redbear-netstat/source/Cargo.toml b/local/recipes/system/redbear-netstat/source/Cargo.toml index e1c5d419cd..5b4aa85a66 100644 --- a/local/recipes/system/redbear-netstat/source/Cargo.toml +++ b/local/recipes/system/redbear-netstat/source/Cargo.toml @@ -13,3 +13,7 @@ path = "src/main.rs" [[bin]] name = "redbear-netstat" path = "src/main.rs" + +[dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" diff --git a/local/recipes/system/redbear-netstat/source/src/main.rs b/local/recipes/system/redbear-netstat/source/src/main.rs index 7f16f54cb2..86b49bbd66 100644 --- a/local/recipes/system/redbear-netstat/source/src/main.rs +++ b/local/recipes/system/redbear-netstat/source/src/main.rs @@ -2,10 +2,12 @@ use std::env; use std::fs; use std::path::PathBuf; use std::process; +use log::{error, info, warn}; fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { - eprintln!("{}: {err}", program_name()); + log::error!("{}: {err}", program_name())); process::exit(1); } } diff --git a/local/recipes/system/redbear-nmap/source/Cargo.toml b/local/recipes/system/redbear-nmap/source/Cargo.toml index 0acc77a796..2bf6490149 100644 --- a/local/recipes/system/redbear-nmap/source/Cargo.toml +++ b/local/recipes/system/redbear-nmap/source/Cargo.toml @@ -9,3 +9,7 @@ edition = "2024" [[bin]] name = "redbear-nmap" path = "src/main.rs" + +[dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" diff --git a/local/recipes/system/redbear-nmap/source/src/main.rs b/local/recipes/system/redbear-nmap/source/src/main.rs index 4303ab5d36..f44b28c9b8 100644 --- a/local/recipes/system/redbear-nmap/source/src/main.rs +++ b/local/recipes/system/redbear-nmap/source/src/main.rs @@ -3,10 +3,12 @@ use std::io::{self, Read}; use std::net::{IpAddr, SocketAddr, TcpStream, ToSocketAddrs}; use std::process; use std::time::Duration; +use log::{error, info, warn}; fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { - eprintln!("redbear-nmap: {err}"); + log::error!("redbear-nmap: {err}")); process::exit(1); } } diff --git a/local/recipes/system/redbear-notifications/source/Cargo.toml b/local/recipes/system/redbear-notifications/source/Cargo.toml index b76a561bf6..6f221c5118 100644 --- a/local/recipes/system/redbear-notifications/source/Cargo.toml +++ b/local/recipes/system/redbear-notifications/source/Cargo.toml @@ -11,6 +11,8 @@ name = "redbear-notifications" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" zbus = { version = "5", default-features = false, features = ["tokio"] } tokio = { version = "1", default-features = false, features = ["rt", "rt-multi-thread", "macros", "net", "time", "sync"] } serde = { version = "1", features = ["derive"] } diff --git a/local/recipes/system/redbear-notifications/source/src/main.rs b/local/recipes/system/redbear-notifications/source/src/main.rs index c1072cda79..07bd93d402 100644 --- a/local/recipes/system/redbear-notifications/source/src/main.rs +++ b/local/recipes/system/redbear-notifications/source/src/main.rs @@ -1,4 +1,5 @@ use std::{ +use log::{error, info, warn}; collections::{HashMap, HashSet, VecDeque}, env, error::Error, @@ -86,7 +87,7 @@ impl Notifications { let proxy = match DBusProxy::new(&connection).await { Ok(proxy) => proxy, Err(err) => { - eprintln!("redbear-notifications: failed to create DBus proxy: {err}"); + log::error!("redbear-notifications: failed to create DBus proxy: {err}")); return; } }; @@ -110,7 +111,7 @@ impl Notifications { vanished.insert(sender); } Err(err) => { - eprintln!( + log::error!(); "redbear-notifications: name_has_owner check failed: {err}" ); } @@ -157,7 +158,7 @@ impl Notifications { Instant::now(), ); - eprintln!( + log::error!(); "notification {}: app_name={app_name:?} summary={summary:?} body_len={} owner={owner} replaced={:?}", result.id, body.chars().count(), @@ -174,7 +175,7 @@ impl Notifications { id: u32, ) { if self.remove_notification(id, NOTIFICATION_CLOSED_REASON) { - eprintln!("notification: closed {id}"); + log::error!("notification: closed {id}")); let _ = Self::notification_closed(&signal_emitter, id, NOTIFICATION_CLOSED_REASON).await; } @@ -211,7 +212,7 @@ impl Notifications { self.validate_invoke(id, &sender, action_key) .map_err(fdo::Error::Failed)?; - eprintln!("redbear-notifications: invoke action {id:?} -> {action_key:?}"); + log::error!("redbear-notifications: invoke action {id:?} -> {action_key:?}")); let _ = Self::action_invoked(&signal_emitter, id, action_key).await; let _ = self.complete_invocation(id, action_key); Ok(()) @@ -564,36 +565,37 @@ async fn run_daemon() -> Result<(), Box> { notifications.spawn_expiry_sweeper(connection.clone()); notifications.spawn_sender_reaper(connection.clone()); - eprintln!("redbear-notifications: registered {BUS_NAME} on the session bus"); + log::info!("redbear-notifications: registered {BUS_NAME} on the session bus")); let _ = shutdown_rx.changed().await; - eprintln!("redbear-notifications: shutdown signal received, exiting cleanly"); + log::info!("redbear-notifications: shutdown signal received, exiting cleanly")); Ok(()) } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); match parse_args() { Ok(Command::Help) => { - println!("{}", usage()); + log::info!("{}", usage())); } Ok(Command::Run) => { let runtime = match RuntimeBuilder::new_multi_thread().enable_all().build() { Ok(runtime) => runtime, Err(err) => { - eprintln!("redbear-notifications: failed to create tokio runtime: {err}"); + log::error!("redbear-notifications: failed to create tokio runtime: {err}")); process::exit(1); } }; if let Err(err) = runtime.block_on(run_daemon()) { - eprintln!("redbear-notifications: fatal error: {err}"); + log::error!("redbear-notifications: fatal error: {err}")); process::exit(1); } } Err(err) => { - eprintln!("redbear-notifications: {err}"); - eprintln!("{}", usage()); + log::error!("redbear-notifications: {err}")); + log::error!("{}", usage())); process::exit(1); } } diff --git a/local/recipes/system/redbear-polkit/source/Cargo.toml b/local/recipes/system/redbear-polkit/source/Cargo.toml index 3c3cf1112b..726efc70a1 100644 --- a/local/recipes/system/redbear-polkit/source/Cargo.toml +++ b/local/recipes/system/redbear-polkit/source/Cargo.toml @@ -11,6 +11,8 @@ name = "redbear-polkit" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" zbus = { version = "5", default-features = false, features = ["tokio"] } tokio = { version = "1", default-features = false, features = ["rt", "rt-multi-thread", "macros", "net", "time", "sync"] } serde = { version = "1", features = ["derive"] } diff --git a/local/recipes/system/redbear-polkit/source/src/main.rs b/local/recipes/system/redbear-polkit/source/src/main.rs index 7db8a1da31..f53105f732 100644 --- a/local/recipes/system/redbear-polkit/source/src/main.rs +++ b/local/recipes/system/redbear-polkit/source/src/main.rs @@ -2,6 +2,7 @@ use std::{collections::HashMap, env, error::Error, fs, process, time::Duration}; use tokio::runtime::Builder as RuntimeBuilder; use zbus::{ +use log::{error, info, warn}; Address, connection::Builder as ConnectionBuilder, interface, @@ -267,7 +268,7 @@ async fn wait_for_dbus_socket() { } tokio::time::sleep(Duration::from_secs(1)).await; } - eprintln!("redbear-polkit: timed out waiting for D-Bus socket at {socket_path}"); + log::error!("redbear-polkit: timed out waiting for D-Bus socket at {socket_path}")); } fn parse_args() -> Result { @@ -333,7 +334,7 @@ impl PolicyKitAuthority { ) -> (bool, bool, Details) { let uid = extract_uid_from_subject(&subject).unwrap_or(0); let authorized = is_authorized(uid, action_id); - eprintln!( + log::error!(); "redbear-polkit: CheckAuthorization(subject_kind={subject_kind:?}, uid={uid}, action_id={action_id:?}) -> authorized={authorized}" ); (authorized, false, Details::new()) @@ -561,15 +562,15 @@ async fn run_daemon() -> Result<(), Box> { .await { Ok(connection) => { - eprintln!("redbear-polkit: registered {BUS_NAME} on the system bus"); + log::info!("redbear-polkit: registered {BUS_NAME} on the system bus")); let _ = shutdown_rx.changed().await; - eprintln!("redbear-polkit: shutdown signal received, exiting cleanly"); + log::info!("redbear-polkit: shutdown signal received, exiting cleanly")); drop(connection); return Ok(()); } Err(err) => { if attempt < 3 { - eprintln!( + log::error!(); "redbear-polkit: attempt {attempt}/3 failed ({err}), retrying in 1s..." ); tokio::time::sleep(Duration::from_secs(1)).await; @@ -586,27 +587,28 @@ async fn run_daemon() -> Result<(), Box> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); match parse_args() { Ok(Command::Help) => { - println!("{}", usage()); + log::info!("{}", usage())); } Ok(Command::Run) => { let runtime = match RuntimeBuilder::new_multi_thread().enable_all().build() { Ok(runtime) => runtime, Err(err) => { - eprintln!("redbear-polkit: failed to create tokio runtime: {err}"); + log::error!("redbear-polkit: failed to create tokio runtime: {err}")); process::exit(1); } }; if let Err(err) = runtime.block_on(run_daemon()) { - eprintln!("redbear-polkit: fatal error: {err}"); + log::error!("redbear-polkit: fatal error: {err}")); process::exit(1); } } Err(err) => { - eprintln!("redbear-polkit: {err}"); - eprintln!("{}", usage()); + log::error!("redbear-polkit: {err}")); + log::error!("{}", usage())); process::exit(1); } } diff --git a/local/recipes/system/redbear-power/source/Cargo.toml b/local/recipes/system/redbear-power/source/Cargo.toml index 0a13b8977e..22506bbca0 100644 --- a/local/recipes/system/redbear-power/source/Cargo.toml +++ b/local/recipes/system/redbear-power/source/Cargo.toml @@ -19,6 +19,8 @@ toml = "0.8" dirs = "5" serde = { version = "1", features = ["derive"] } serde_json = "1" +log = "0.4" +env_logger = "0.11" [profile.release] lto = true diff --git a/local/recipes/system/redbear-power/source/src/config.rs b/local/recipes/system/redbear-power/source/src/config.rs index a887960872..92f06d4b1a 100644 --- a/local/recipes/system/redbear-power/source/src/config.rs +++ b/local/recipes/system/redbear-power/source/src/config.rs @@ -164,8 +164,8 @@ pub fn load() -> Config { if let Ok(content) = std::fs::read_to_string(&path) { match toml::from_str::(&content) { Ok(partial) => cfg = cfg.merged(partial), - Err(e) => eprintln!( - "redbear-power: config {path:?} parse error: {e}; using defaults for this file" + Err(e) => warn!( + "config {path:?} parse error: {e}; using defaults for this file" ), } } diff --git a/local/recipes/system/redbear-power/source/src/dbus.rs b/local/recipes/system/redbear-power/source/src/dbus.rs index 177ad1e1ac..3e4ef32f1a 100644 --- a/local/recipes/system/redbear-power/source/src/dbus.rs +++ b/local/recipes/system/redbear-power/source/src/dbus.rs @@ -108,7 +108,7 @@ impl DbusServer { .name("redbear-power-dbus".into()) .spawn(move || { if let Err(e) = run_worker(rx, cmd_tx) { - eprintln!("redbear-power: dbus worker exited: {e}"); + error!("dbus worker exited: {e}"); worker_disconnected.store(true, Ordering::Release); } }) diff --git a/local/recipes/system/redbear-power/source/src/main.rs b/local/recipes/system/redbear-power/source/src/main.rs index 2f98de0cd2..b69323fe87 100644 --- a/local/recipes/system/redbear-power/source/src/main.rs +++ b/local/recipes/system/redbear-power/source/src/main.rs @@ -79,6 +79,8 @@ mod wakeup; use crate::app::{App, POLL_MS, TabId}; use crate::graph::BrailleGraph; +use log::{error, info, warn}; + use crate::render::{ GRAPH_HEIGHT, render_battery_panel, render_cpu_table, render_header, render_help, render_info_panel, render_json, render_keybar, render_motherboard_panel, render_network_panel, @@ -138,7 +140,7 @@ fn parse_args() -> Args { if let Some(p) = iter.next() { config_path = Some(std::path::PathBuf::from(p)); } else { - eprintln!("redbear-power: --config requires a path argument"); + error!("--config requires a path argument"); std::process::exit(2); } } @@ -151,8 +153,8 @@ fn parse_args() -> Args { std::process::exit(0); } other => { - eprintln!("redbear-power: unknown argument: {other}"); - eprintln!("try 'redbear-power --help' for usage"); + error!("unknown argument: {other}"); + error!("try 'redbear-power --help' for usage"); std::process::exit(2); } } @@ -238,6 +240,12 @@ fn handle_mouse(me: MouseEvent, header: &Rect, table: &Rect, keybar: &Rect, app: } fn main() -> io::Result<()> { + // Initialize logger before entering raw mode / alternate screen. + // Use stderr so it does not collide with the TUI on stdout. + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")) + .target(env_logger::Target::Stderr) + .init(); + let args = parse_args(); // Let panic unwind so the raw-mode / alternate-screen guards drop @@ -253,11 +261,11 @@ fn main() -> io::Result<()> { // When --config is given, load only that file (no system/user merge). match std::fs::read_to_string(p) { Ok(content) => toml::from_str::(&content).unwrap_or_else(|e| { - eprintln!("redbear-power: --config parse error: {e}"); + error!("--config parse error: {e}"); std::process::exit(2); }), Err(e) => { - eprintln!("redbear-power: --config read error: {e}"); + error!("--config read error: {e}"); std::process::exit(2); } } @@ -285,8 +293,8 @@ fn main() -> io::Result<()> { app.refresh(); // Second refresh for graph histories (need ≥2 points for line graph). app.refresh(); - eprintln!( - "redbear-power: {} cores, governor={}, msr={}, pss={}, load={}, hwmon={}, dmi={}, dmi_name={}", + info!( + "{} cores, governor={}, msr={}, pss={}, load={}, hwmon={}, dmi={}, dmi_name={}", app.cpus.len(), app.cpufreq.active.as_str(), if app.msr_available { "ok" } else { "no" }, @@ -297,8 +305,8 @@ fn main() -> io::Result<()> { app.dmi.product_name.as_deref().unwrap_or("?"), ); if !app.msr_available { - eprintln!( - "redbear-power: MSR unavailable — temps/load from hwmon/sysfs only (run as root for MSR)" + warn!( + "MSR unavailable — temps/load from hwmon/sysfs only (run as root for MSR)" ); } @@ -312,7 +320,7 @@ fn main() -> io::Result<()> { // Check that stdout is a terminal before entering raw mode. use std::io::IsTerminal; if !std::io::stdout().is_terminal() { - eprintln!("redbear-power: stdout is not a terminal; use --once for non-interactive mode"); + error!("stdout is not a terminal; use --once for non-interactive mode"); std::process::exit(1); } @@ -358,12 +366,12 @@ fn main() -> io::Result<()> { let dbus_server = if args.dbus { match dbus::DbusServer::spawn() { Ok(s) => { - eprintln!("redbear-power: dbus: org.redbear.Power registered on session bus"); + info!("dbus: org.redbear.Power registered on session bus"); Some(s) } Err(e) => { - eprintln!( - "redbear-power: dbus: session bus unavailable ({e}); running without D-Bus" + warn!( + "dbus: session bus unavailable ({e}); running without D-Bus" ); None } diff --git a/local/recipes/system/redbear-power/source/src/session.rs b/local/recipes/system/redbear-power/source/src/session.rs index faa25312bb..e485bc5658 100644 --- a/local/recipes/system/redbear-power/source/src/session.rs +++ b/local/recipes/system/redbear-power/source/src/session.rs @@ -101,7 +101,7 @@ impl SessionState { let path = Self::path(); match std::fs::read_to_string(&path) { Ok(content) => toml::from_str::(&content).unwrap_or_else(|e| { - eprintln!("redbear-power: session {path:?} parse error: {e}; using defaults"); + warn!("session {path:?} parse error: {e}; using defaults"); Self::default() }), Err(_) => Self::default(), @@ -117,17 +117,17 @@ impl SessionState { pub fn save(&self) { let path = Self::path(); let Some(parent) = path.parent() else { - eprintln!("redbear-power: session path has no parent; cannot save"); + warn!("session path has no parent; cannot save"); return; }; if let Err(e) = std::fs::create_dir_all(parent) { - eprintln!("redbear-power: session dir {parent:?} create failed: {e}"); + warn!("session dir {parent:?} create failed: {e}"); return; } let serialized = match toml::to_string(self) { Ok(s) => s, Err(e) => { - eprintln!("redbear-power: session serialize failed: {e}"); + warn!("session serialize failed: {e}"); return; } }; @@ -137,11 +137,11 @@ impl SessionState { let mut tmp = path.clone(); tmp.as_mut_os_string().push(".tmp"); if let Err(e) = std::fs::write(&tmp, serialized) { - eprintln!("redbear-power: session tmp write {tmp:?} failed: {e}"); + warn!("session tmp write {tmp:?} failed: {e}"); return; } if let Err(e) = std::fs::rename(&tmp, &path) { - eprintln!("redbear-power: session rename to {path:?} failed: {e}"); + warn!("session rename to {path:?} failed: {e}"); } } } diff --git a/local/recipes/system/redbear-session-launch/source/Cargo.toml b/local/recipes/system/redbear-session-launch/source/Cargo.toml index d5b7b95cc0..3678368bd3 100644 --- a/local/recipes/system/redbear-session-launch/source/Cargo.toml +++ b/local/recipes/system/redbear-session-launch/source/Cargo.toml @@ -11,4 +11,6 @@ name = "redbear-session-launch" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" libc = "0.2" diff --git a/local/recipes/system/redbear-session-launch/source/src/main.rs b/local/recipes/system/redbear-session-launch/source/src/main.rs index 8101a3d0d6..9efa71402b 100644 --- a/local/recipes/system/redbear-session-launch/source/src/main.rs +++ b/local/recipes/system/redbear-session-launch/source/src/main.rs @@ -1,4 +1,5 @@ use std::{ +use log::{error, info, warn}; collections::{BTreeMap, HashMap}, env, ffi::CString, @@ -399,9 +400,10 @@ fn run() -> Result<(), String> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { - eprintln!("redbear-session-launch: {err}"); - eprintln!("{}", usage()); + log::error!("redbear-session-launch: {err}")); + log::error!("{}", usage())); process::exit(1); } } diff --git a/local/recipes/system/redbear-sessiond/source/Cargo.toml b/local/recipes/system/redbear-sessiond/source/Cargo.toml index a8ef768ac6..796cf5ef25 100644 --- a/local/recipes/system/redbear-sessiond/source/Cargo.toml +++ b/local/recipes/system/redbear-sessiond/source/Cargo.toml @@ -15,6 +15,8 @@ zbus = { version = "5", default-features = false, features = ["tokio"] } tokio = { version = "1", default-features = false, features = ["rt", "rt-multi-thread", "macros", "net", "time", "sync"] } serde = { version = "1", features = ["derive"] } serde_json = "1" +log = "0.4" +env_logger = "0.11" libc = "0.2" libredox = { path = "../../../../../local/sources/libredox" } redox-syscall = { path = "../../../../../local/sources/syscall", package = "redox_syscall" } diff --git a/local/recipes/system/redbear-sessiond/source/src/acpi_watcher.rs b/local/recipes/system/redbear-sessiond/source/src/acpi_watcher.rs index 192e545f91..733866e014 100644 --- a/local/recipes/system/redbear-sessiond/source/src/acpi_watcher.rs +++ b/local/recipes/system/redbear-sessiond/source/src/acpi_watcher.rs @@ -79,9 +79,9 @@ async fn watch_shutdown_edge(connection: Connection, runtime: SharedRuntime) { ) .await { - eprintln!("redbear-sessiond: PrepareForShutdown(before=true) emit failed: {err}"); + log::error!("redbear-sessiond: PrepareForShutdown(before=true) emit failed: {err}"); } - eprintln!("redbear-sessiond: PrepareForShutdown(before=true) emitted"); + log::info!("redbear-sessiond: PrepareForShutdown(before=true) emitted"); } async fn watch_sleep_edge(connection: Connection, runtime: SharedRuntime) { @@ -99,9 +99,9 @@ async fn watch_sleep_edge(connection: Connection, runtime: SharedRuntime) { ) .await { - eprintln!("redbear-sessiond: PrepareForSleep(before=true) emit failed: {err}"); + log::error!("redbear-sessiond: PrepareForSleep(before=true) emit failed: {err}"); } - eprintln!("redbear-sessiond: PrepareForSleep(before=true) emitted"); + log::info!("redbear-sessiond: PrepareForSleep(before=true) emitted"); let _ = tokio::task::spawn_blocking(wait_for_sleep_edge).await; if let Ok(mut state) = runtime.write() { @@ -117,9 +117,9 @@ async fn watch_sleep_edge(connection: Connection, runtime: SharedRuntime) { ) .await { - eprintln!("redbear-sessiond: PrepareForSleep(before=false) emit failed: {err}"); + log::error!("redbear-sessiond: PrepareForSleep(before=false) emit failed: {err}"); } - eprintln!("redbear-sessiond: PrepareForSleep(before=false) emitted (resumed)"); + log::info!("redbear-sessiond: PrepareForSleep(before=false) emitted (resumed)"); } pub async fn watch_and_emit(connection: Connection, runtime: SharedRuntime) { diff --git a/local/recipes/system/redbear-sessiond/source/src/control.rs b/local/recipes/system/redbear-sessiond/source/src/control.rs index 9a1a0e2540..9252fff0ec 100644 --- a/local/recipes/system/redbear-sessiond/source/src/control.rs +++ b/local/recipes/system/redbear-sessiond/source/src/control.rs @@ -76,7 +76,7 @@ fn apply_message( state, } => { let Ok(mut runtime) = runtime.write() else { - eprintln!("redbear-sessiond: runtime state is poisoned"); + log::error!("redbear-sessiond: runtime state is poisoned"); return; }; runtime.username = username; @@ -88,7 +88,7 @@ fn apply_message( } ControlMessage::ResetSession { vt } => { let Ok(mut runtime) = runtime.write() else { - eprintln!("redbear-sessiond: runtime state is poisoned"); + log::error!("redbear-sessiond: runtime state is poisoned"); return; }; runtime.username = String::from("root"); @@ -99,44 +99,44 @@ fn apply_message( runtime.active = true; } ControlMessage::Shutdown => { - eprintln!("redbear-sessiond: shutdown requested via control socket"); + log::info!("redbear-sessiond: shutdown requested via control socket"); let _ = shutdown_tx.send(true); } ControlMessage::SetInhibitDelay { usec } => { let Ok(runtime) = runtime.read() else { - eprintln!("redbear-sessiond: runtime state is poisoned"); + log::error!("redbear-sessiond: runtime state is poisoned"); return; }; runtime.inhibit_delay_max_us.store(usec, Ordering::Relaxed); - eprintln!("redbear-sessiond: InhibitDelayMaxUSec set to {usec}"); + log::info!("redbear-sessiond: InhibitDelayMaxUSec set to {usec}"); } ControlMessage::SetLidSwitch { action } => { let Ok(runtime) = runtime.read() else { - eprintln!("redbear-sessiond: runtime state is poisoned"); + log::error!("redbear-sessiond: runtime state is poisoned"); return; }; if let Ok(mut guard) = runtime.handle_lid_switch.write() { *guard = action.clone(); - eprintln!("redbear-sessiond: HandleLidSwitch set to '{action}'"); + log::info!("redbear-sessiond: HandleLidSwitch set to '{action}'"); } } ControlMessage::SetPowerKey { action } => { let Ok(runtime) = runtime.read() else { - eprintln!("redbear-sessiond: runtime state is poisoned"); + log::error!("redbear-sessiond: runtime state is poisoned"); return; }; if let Ok(mut guard) = runtime.handle_power_key.write() { *guard = action.clone(); - eprintln!("redbear-sessiond: HandlePowerKey set to '{action}'"); + log::info!("redbear-sessiond: HandlePowerKey set to '{action}'"); } } ControlMessage::SetLastActivity { timestamp_us } => { let Ok(runtime) = runtime.read() else { - eprintln!("redbear-sessiond: runtime state is poisoned"); + log::error!("redbear-sessiond: runtime state is poisoned"); return; }; runtime.last_activity_us.store(timestamp_us, Ordering::Relaxed); - eprintln!("redbear-sessiond: last activity timestamp set to {timestamp_us}"); + log::info!("redbear-sessiond: last activity timestamp set to {timestamp_us}"); } } } @@ -149,7 +149,7 @@ pub fn start_control_socket( std::thread::spawn(move || { if Path::new(CONTROL_SOCKET_PATH).exists() { if let Err(err) = fs::remove_file(CONTROL_SOCKET_PATH) { - eprintln!("redbear-sessiond: failed to remove stale control socket: {err}"); + log::error!("redbear-sessiond: failed to remove stale control socket: {err}"); return; } } @@ -157,13 +157,13 @@ pub fn start_control_socket( let listener = match UnixListener::bind(CONTROL_SOCKET_PATH) { Ok(listener) => listener, Err(err) => { - eprintln!("redbear-sessiond: failed to bind control socket: {err}"); + log::error!("redbear-sessiond: failed to bind control socket: {err}"); return; } }; if let Err(err) = fs::set_permissions(CONTROL_SOCKET_PATH, fs::Permissions::from_mode(0o600)) { - eprintln!("redbear-sessiond: failed to chmod control socket: {err}"); + log::error!("redbear-sessiond: failed to chmod control socket: {err}"); } let shutdown_ref = Arc::clone(&shutdown_tx); @@ -178,7 +178,7 @@ pub fn start_control_socket( } match serde_json::from_str::(line.trim()) { Ok(message) => apply_message(&runtime, &shutdown_ref, message), - Err(err) => eprintln!("redbear-sessiond: invalid control message: {err}"), + Err(err) => log::warn!("redbear-sessiond: invalid control message: {err}"), } } }); diff --git a/local/recipes/system/redbear-sessiond/source/src/main.rs b/local/recipes/system/redbear-sessiond/source/src/main.rs index 35e5ae8a20..e7c7156e9b 100644 --- a/local/recipes/system/redbear-sessiond/source/src/main.rs +++ b/local/recipes/system/redbear-sessiond/source/src/main.rs @@ -96,7 +96,7 @@ fn dbus_socket_candidates() -> Vec { async fn wait_for_dbus_socket() { let candidates = dbus_socket_candidates(); - eprintln!( + log::info!( "redbear-sessiond: probing {} D-Bus socket candidate(s): {:?}", candidates.len(), candidates @@ -108,20 +108,20 @@ async fn wait_for_dbus_socket() { for tick in 0..30 { for candidate in &candidates { if tokio::net::UnixStream::connect(candidate).await.is_ok() { - eprintln!( + log::info!( "redbear-sessiond: D-Bus socket reachable at {candidate} after {tick}s" ); return; } } if tick == 0 { - eprintln!("redbear-sessiond: still waiting for D-Bus socket (up to 30s)"); + log::info!("redbear-sessiond: still waiting for D-Bus socket (up to 30s)"); } else if tick % 5 == 0 { - eprintln!("redbear-sessiond: still waiting for D-Bus socket ({tick}s elapsed)"); + log::info!("redbear-sessiond: still waiting for D-Bus socket ({tick}s elapsed)"); } tokio::time::sleep(Duration::from_secs(1)).await; } - eprintln!( + log::info!( "redbear-sessiond: timed out waiting for D-Bus socket, last tried: {:?}", candidates ); @@ -199,7 +199,7 @@ async fn run_daemon() -> Result<(), Box> { .await { Ok(connection) => { - eprintln!("redbear-sessiond: registered {BUS_NAME} on the system bus at {bus_addr}"); + log::info!("redbear-sessiond: registered {BUS_NAME} on the system bus at {bus_addr}"); manager_ref.set_connection(connection.clone()); session.set_connection(connection.clone()); control::start_control_socket(runtime.clone(), shutdown_tx.clone()); @@ -214,7 +214,7 @@ async fn run_daemon() -> Result<(), Box> { match zbus::zvariant::OwnedObjectPath::try_from(SEAT_PATH.to_owned()) { Ok(p) => p, Err(_) => { - eprintln!( + log::info!( "redbear-sessiond: SEAT_PATH constant is not a valid D-Bus path; skipping SeatRemoved" ); drop(connection); @@ -233,7 +233,7 @@ async fn run_daemon() -> Result<(), Box> { // (but harmless) boot noise; only report if it keeps failing. if attempt < 3 { if attempt >= 2 { - eprintln!( + log::info!( "redbear-sessiond: attempt {attempt}/3 failed on {bus_addr} ({err}), retrying in 1s..." ); } @@ -315,19 +315,19 @@ fn main() { let runtime = match RuntimeBuilder::new_multi_thread().enable_all().build() { Ok(runtime) => runtime, Err(err) => { - eprintln!("redbear-sessiond: failed to create tokio runtime: {err}"); + log::error!("redbear-sessiond: failed to create tokio runtime: {err}"); process::exit(1); } }; if let Err(err) = runtime.block_on(run_daemon()) { - eprintln!("redbear-sessiond: fatal error: {err}"); + log::error!("redbear-sessiond: fatal error: {err}"); process::exit(1); } } Err(err) => { - eprintln!("redbear-sessiond: {err}"); - eprintln!("{}", usage()); + log::info!("redbear-sessiond: {err}"); + log::info!("{}", usage()); process::exit(1); } } diff --git a/local/recipes/system/redbear-sessiond/source/src/manager.rs b/local/recipes/system/redbear-sessiond/source/src/manager.rs index 1380d01f91..acd5da48b9 100644 --- a/local/recipes/system/redbear-sessiond/source/src/manager.rs +++ b/local/recipes/system/redbear-sessiond/source/src/manager.rs @@ -116,7 +116,7 @@ impl LoginManager { } } if !removed_fds.is_empty() { - eprintln!( + log::info!( "redbear-sessiond: reaped {} inhibitor(s) for vanished bus name '{vanished_sender}'", removed_fds.len() ); @@ -140,7 +140,7 @@ impl LoginManager { removed = runtime.inhibitors.len() < before; } if removed { - eprintln!( + log::info!( "redbear-sessiond: reaped inhibitor {inhibitor_id} (caller FD closed)" ); } @@ -154,7 +154,7 @@ impl LoginManager { let conn = match self.get_connection() { Some(c) => c, None => { - eprintln!( + log::info!( "redbear-sessiond: inhibitor reaper has no connection; inhibitor lifecycle reaping disabled" ); return; @@ -164,7 +164,7 @@ impl LoginManager { let proxy = match DBusProxy::new(&conn).await { Ok(p) => p, Err(err) => { - eprintln!( + log::info!( "redbear-sessiond: inhibitor reaper failed to create DBus proxy: {err}" ); return; @@ -199,7 +199,7 @@ impl LoginManager { self.reap_inhibitors_for_sender(sender); } Err(err) => { - eprintln!( + log::info!( "redbear-sessiond: inhibitor reaper name_has_owner('{sender}') failed: {err}" ); } @@ -275,7 +275,7 @@ impl LoginManager { }); } - eprintln!( + log::info!( "redbear-sessiond: Inhibit(what={what}, who={who}, mode={mode}) granted as inhibitor #{inhibitor_id}" ); @@ -294,7 +294,7 @@ impl LoginManager { ) .await { - eprintln!( + log::info!( "redbear-sessiond: PrepareForShutdown(before={before}) emit failed: {err}" ); } @@ -313,7 +313,7 @@ impl LoginManager { ) .await { - eprintln!( + log::info!( "redbear-sessiond: PrepareForSleep(before={before}) emit failed: {err}" ); } @@ -332,11 +332,11 @@ impl LoginManager { ) .await { - eprintln!( + log::info!( "redbear-sessiond: SeatNew({id}, {seat_path}) emit failed: {err}" ); } else { - eprintln!("redbear-sessiond: SeatNew emitted for {id} -> {seat_path}"); + log::info!("redbear-sessiond: SeatNew emitted for {id} -> {seat_path}"); } } } @@ -353,11 +353,11 @@ impl LoginManager { ) .await { - eprintln!( + log::info!( "redbear-sessiond: SeatRemoved({id}, {seat_path}) emit failed: {err}" ); } else { - eprintln!("redbear-sessiond: SeatRemoved emitted for {id} -> {seat_path}"); + log::info!("redbear-sessiond: SeatRemoved emitted for {id} -> {seat_path}"); } } } @@ -487,7 +487,7 @@ impl LoginManager { } async fn power_off(&self, _interactive: bool) -> fdo::Result<()> { - eprintln!("redbear-sessiond: PowerOff requested"); + log::info!("redbear-sessiond: PowerOff requested"); if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_shutdown = true; } @@ -500,7 +500,7 @@ impl LoginManager { if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_shutdown = false; } - eprintln!("redbear-sessiond: PowerOff kstop write failed: {e}"); + log::error!("redbear-sessiond: PowerOff kstop write failed: {e}"); return Err(fdo::Error::Failed(format!( "cannot write to /scheme/sys/kstop for shutdown: {e}" ))); @@ -510,7 +510,7 @@ impl LoginManager { if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_shutdown = false; } - eprintln!("redbear-sessiond: PowerOff kstop open failed: {e}"); + log::error!("redbear-sessiond: PowerOff kstop open failed: {e}"); return Err(fdo::Error::Failed(format!( "cannot open /scheme/sys/kstop for shutdown: {e}" ))); @@ -522,7 +522,7 @@ impl LoginManager { } async fn reboot(&self, _interactive: bool) -> fdo::Result<()> { - eprintln!("redbear-sessiond: Reboot requested"); + log::info!("redbear-sessiond: Reboot requested"); if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_shutdown = true; } @@ -535,7 +535,7 @@ impl LoginManager { if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_shutdown = false; } - eprintln!("redbear-sessiond: Reboot kstop write failed: {e}"); + log::error!("redbear-sessiond: Reboot kstop write failed: {e}"); return Err(fdo::Error::Failed(format!( "cannot write to /scheme/sys/kstop for reboot: {e}" ))); @@ -545,7 +545,7 @@ impl LoginManager { if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_shutdown = false; } - eprintln!("redbear-sessiond: Reboot kstop open failed: {e}"); + log::error!("redbear-sessiond: Reboot kstop open failed: {e}"); return Err(fdo::Error::Failed(format!( "cannot open /scheme/sys/kstop for reboot: {e}" ))); @@ -557,7 +557,7 @@ impl LoginManager { } async fn suspend(&self, _interactive: bool) -> fdo::Result<()> { - eprintln!("redbear-sessiond: Suspend requested — sending to kernel kstop"); + log::info!("redbear-sessiond: Suspend requested — sending to kernel kstop"); if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_sleep = true; } @@ -570,7 +570,7 @@ impl LoginManager { if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_sleep = false; } - eprintln!("redbear-sessiond: Suspend kstop write failed: {e}"); + log::error!("redbear-sessiond: Suspend kstop write failed: {e}"); return Err(fdo::Error::Failed(format!( "cannot write to /scheme/sys/kstop for suspend: {e}" ))); @@ -580,7 +580,7 @@ impl LoginManager { if let Ok(mut runtime) = self.runtime.write() { runtime.preparing_for_sleep = false; } - eprintln!("redbear-sessiond: Suspend kstop open failed: {e}"); + log::error!("redbear-sessiond: Suspend kstop open failed: {e}"); return Err(fdo::Error::Failed(format!( "cannot open /scheme/sys/kstop for suspend: {e}" ))); @@ -649,7 +649,7 @@ impl LoginManager { } runtime.active = true; - eprintln!("redbear-sessiond: ActivateSession({session_id})"); + log::info!("redbear-sessiond: ActivateSession({session_id})"); Ok(()) } @@ -663,7 +663,7 @@ impl LoginManager { } runtime.active = true; - eprintln!("redbear-sessiond: ActivateSessionOnSeat({session_id}, {seat_id})"); + log::info!("redbear-sessiond: ActivateSessionOnSeat({session_id}, {seat_id})"); Ok(()) } @@ -674,7 +674,7 @@ impl LoginManager { } runtime.locked_hint = true; - eprintln!("redbear-sessiond: LockSession({session_id})"); + log::info!("redbear-sessiond: LockSession({session_id})"); Ok(()) } @@ -685,7 +685,7 @@ impl LoginManager { } runtime.locked_hint = false; - eprintln!("redbear-sessiond: UnlockSession({session_id})"); + log::info!("redbear-sessiond: UnlockSession({session_id})"); Ok(()) } @@ -696,7 +696,7 @@ impl LoginManager { runtime.session_id.clone() }; - eprintln!("redbear-sessiond: LockSessions() -> {session_id}"); + log::info!("redbear-sessiond: LockSessions() -> {session_id}"); Ok(()) } @@ -707,7 +707,7 @@ impl LoginManager { runtime.session_id.clone() }; - eprintln!("redbear-sessiond: UnlockSessions() -> {session_id}"); + log::info!("redbear-sessiond: UnlockSessions() -> {session_id}"); Ok(()) } @@ -719,7 +719,7 @@ impl LoginManager { runtime.state = String::from("closing"); runtime.active = false; - eprintln!("redbear-sessiond: TerminateSession({session_id})"); + log::info!("redbear-sessiond: TerminateSession({session_id})"); Ok(()) } @@ -731,7 +731,7 @@ impl LoginManager { runtime.state = String::from("closing"); runtime.active = false; - eprintln!("redbear-sessiond: TerminateUser({uid})"); + log::info!("redbear-sessiond: TerminateUser({uid})"); Ok(()) } @@ -742,7 +742,7 @@ impl LoginManager { } let leader = runtime.leader; - eprintln!( + log::info!( "redbear-sessiond: KillSession({session_id}, who={who}, signal={signal_number}) — sending to PID {leader}" ); drop(runtime); @@ -769,7 +769,7 @@ impl LoginManager { } let leader = runtime.leader; - eprintln!( + log::info!( "redbear-sessiond: KillUser({uid}, signal={signal_number}) — sending to PID {leader}" ); drop(runtime); diff --git a/local/recipes/system/redbear-sessiond/source/src/seat.rs b/local/recipes/system/redbear-sessiond/source/src/seat.rs index 87338f1ea7..7b77261453 100644 --- a/local/recipes/system/redbear-sessiond/source/src/seat.rs +++ b/local/recipes/system/redbear-sessiond/source/src/seat.rs @@ -75,7 +75,7 @@ impl LoginSeat { runtime.vt = vt; runtime.active = true; - eprintln!("redbear-sessiond: SwitchTo requested for seat {} -> vt {vt}", self.id); + log::info!("redbear-sessiond: SwitchTo requested for seat {} -> vt {vt}", self.id); Ok(()) } diff --git a/local/recipes/system/redbear-sessiond/source/src/session.rs b/local/recipes/system/redbear-sessiond/source/src/session.rs index 5005316c8b..8af7f9d79a 100644 --- a/local/recipes/system/redbear-sessiond/source/src/session.rs +++ b/local/recipes/system/redbear-sessiond/source/src/session.rs @@ -95,7 +95,7 @@ impl LoginSession { #[interface(name = "org.freedesktop.login1.Session")] impl LoginSession { fn activate(&self) -> fdo::Result<()> { - eprintln!("redbear-sessiond: Activate requested for session {}", self.runtime()?.session_id); + log::info!("redbear-sessiond: Activate requested for session {}", self.runtime()?.session_id); Ok(()) } @@ -109,7 +109,7 @@ impl LoginSession { ))); } *controlled = true; - eprintln!( + log::info!( "redbear-sessiond: TakeControl requested for session {} (force={force})", runtime.session_id ); @@ -120,7 +120,7 @@ impl LoginSession { let mut controlled = self.control_state()?; *controlled = false; self.taken_devices()?.clear(); - eprintln!("redbear-sessiond: ReleaseControl requested for session {}", self.runtime()?.session_id); + log::info!("redbear-sessiond: ReleaseControl requested for session {}", self.runtime()?.session_id); Ok(()) } @@ -151,7 +151,7 @@ impl LoginSession { taken_devices.insert((major, minor)); let owned_fd: StdOwnedFd = file.into(); - eprintln!( + log::info!( "redbear-sessiond: TakeDevice granted for session {} -> ({major}, {minor}) at {}", runtime.session_id, path ); @@ -193,12 +193,12 @@ impl LoginSession { &(major, minor, device_kind.as_str()), ) .await; - eprintln!( + log::info!( "redbear-sessiond: PauseDevice signal emitted for ({major}, {minor}, {device_kind}) on TakeDevice({path_for_log})" ); } None => { - eprintln!( + log::info!( "redbear-sessiond: skipping PauseDevice emission on TakeDevice — no D-Bus connection" ); } @@ -218,7 +218,7 @@ impl LoginSession { runtime.session_id ))); } - eprintln!( + log::info!( "redbear-sessiond: ReleaseDevice requested for session {} -> ({major}, {minor})", runtime.session_id ); @@ -240,14 +240,14 @@ impl LoginSession { Ok((path, file)) }) { Ok((resume_path, resume_file)) => { - eprintln!( + log::info!( "redbear-sessiond: re-opened ({major}, {minor}) at {resume_path} for ResumeDevice signal" ); let owned: StdOwnedFd = resume_file.into(); Some(owned) } Err(err) => { - eprintln!( + log::info!( "redbear-sessiond: could not re-open ({major}, {minor}) for ResumeDevice signal: {err}" ); None @@ -273,16 +273,16 @@ impl LoginSession { ) .await; match result { - Ok(()) => eprintln!( + Ok(()) => log::info!( "redbear-sessiond: ResumeDevice signal emitted for ({major}, {minor}) on ReleaseDevice" ), - Err(err) => eprintln!( + Err(err) => log::info!( "redbear-sessiond: failed to emit ResumeDevice signal for ({major}, {minor}): {err}" ), } } None => { - eprintln!( + log::info!( "redbear-sessiond: skipping ResumeDevice emission on ReleaseDevice — no D-Bus connection" ); } @@ -294,7 +294,7 @@ impl LoginSession { } fn pause_device_complete(&self, major: u32, minor: u32) -> fdo::Result<()> { - eprintln!( + log::info!( "redbear-sessiond: PauseDeviceComplete received for session {} -> ({major}, {minor})", self.runtime()?.session_id ); @@ -309,7 +309,7 @@ impl LoginSession { if let Ok(mut guard) = self.runtime.write() { guard.idle_hint = idle; } - eprintln!("redbear-sessiond: SetIdleHint({idle}) for session {session_id}"); + log::info!("redbear-sessiond: SetIdleHint({idle}) for session {session_id}"); Ok(()) } @@ -321,7 +321,7 @@ impl LoginSession { if let Ok(mut guard) = self.runtime.write() { guard.locked_hint = locked; } - eprintln!("redbear-sessiond: SetLockedHint({locked}) for session {session_id}"); + log::info!("redbear-sessiond: SetLockedHint({locked}) for session {session_id}"); Ok(()) } @@ -333,7 +333,7 @@ impl LoginSession { if let Ok(mut guard) = self.runtime.write() { guard.session_type = session_type.to_owned(); } - eprintln!("redbear-sessiond: SetType({session_type}) for session {session_id}"); + log::info!("redbear-sessiond: SetType({session_type}) for session {session_id}"); Ok(()) } @@ -343,14 +343,14 @@ impl LoginSession { drop(runtime); self.runtime_write()?.state = String::from("closing"); - eprintln!("redbear-sessiond: Terminate requested for session {session_id}"); + log::info!("redbear-sessiond: Terminate requested for session {session_id}"); Ok(()) } fn kill(&self, who: &str, signal_number: i32) -> fdo::Result<()> { let leader = self.leader(); let sig = signal_number as u32; - eprintln!( + log::info!( "redbear-sessiond: Kill session {} (who={who}, signal={signal_number}) → PID {leader}", self.runtime()?.session_id ); @@ -478,7 +478,7 @@ impl LoginSession { minor: u32, kind: String, ) -> zbus::Result<()> { - eprintln!("redbear-sessiond: PauseDevice signal emitted ({major}, {minor}, {kind})"); + log::info!("redbear-sessiond: PauseDevice signal emitted ({major}, {minor}, {kind})"); Ok(()) } @@ -489,19 +489,19 @@ impl LoginSession { minor: u32, fd: Fd<'_>, ) -> zbus::Result<()> { - eprintln!("redbear-sessiond: ResumeDevice signal emitted ({major}, {minor})"); + log::info!("redbear-sessiond: ResumeDevice signal emitted ({major}, {minor})"); Ok(()) } #[zbus(signal, name = "Lock")] async fn lock(signal_emitter: &SignalEmitter<'_>) -> zbus::Result<()> { - eprintln!("redbear-sessiond: Lock signal emitted"); + log::info!("redbear-sessiond: Lock signal emitted"); Ok(()) } #[zbus(signal, name = "Unlock")] async fn unlock(signal_emitter: &SignalEmitter<'_>) -> zbus::Result<()> { - eprintln!("redbear-sessiond: Unlock signal emitted"); + log::info!("redbear-sessiond: Unlock signal emitted"); Ok(()) } } diff --git a/local/recipes/system/redbear-statusnotifierwatcher/source/Cargo.toml b/local/recipes/system/redbear-statusnotifierwatcher/source/Cargo.toml index 8bdda9ef32..783937536b 100644 --- a/local/recipes/system/redbear-statusnotifierwatcher/source/Cargo.toml +++ b/local/recipes/system/redbear-statusnotifierwatcher/source/Cargo.toml @@ -11,5 +11,7 @@ name = "redbear-statusnotifierwatcher" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" zbus = { version = "5", default-features = false, features = ["tokio"] } tokio = { version = "1", default-features = false, features = ["rt", "rt-multi-thread", "macros", "net", "time", "sync"] } diff --git a/local/recipes/system/redbear-statusnotifierwatcher/source/src/main.rs b/local/recipes/system/redbear-statusnotifierwatcher/source/src/main.rs index 33d8186bdb..cf37f8131c 100644 --- a/local/recipes/system/redbear-statusnotifierwatcher/source/src/main.rs +++ b/local/recipes/system/redbear-statusnotifierwatcher/source/src/main.rs @@ -4,6 +4,7 @@ use std::pin::pin; use std::sync::{Arc, Mutex}; use zbus::{ +use log::{error, info, warn}; connection::Builder as ConnectionBuilder, export::futures_core::Stream, fdo, interface, message::Header, object_server::SignalEmitter, proxy, zvariant::ObjectPath, }; @@ -368,7 +369,7 @@ impl StatusNotifierWatcher { item: &str, ) -> fdo::Result<()> { if let Err(msg) = validate_input(item) { - eprintln!("statusnotifierwatcher: rejected item registration: {msg}"); + log::error!("statusnotifierwatcher: rejected item registration: {msg}")); return Err(fdo::Error::InvalidArgs(msg)); } let owner = hdr @@ -380,7 +381,7 @@ impl StatusNotifierWatcher { let is_new = self.register_item(&owner, item); if is_new { - eprintln!("statusnotifierwatcher: item registered: {item} (owner: {owner})"); + log::info!("statusnotifierwatcher: item registered: {item} (owner: {owner})")); let _ = Self::status_notifier_item_registered(&signal_emitter, item).await; } Ok(()) @@ -405,7 +406,7 @@ impl StatusNotifierWatcher { let was_present = self.unregister_item(&owner, item); if was_present { - eprintln!("statusnotifierwatcher: item unregistered: {item} (owner: {owner})"); + log::error!("statusnotifierwatcher: item unregistered: {item} (owner: {owner})")); let _ = Self::status_notifier_item_unregistered(&signal_emitter, item).await; } Ok(()) @@ -419,7 +420,7 @@ impl StatusNotifierWatcher { host: &str, ) -> fdo::Result<()> { if let Err(msg) = validate_input(host) { - eprintln!("statusnotifierwatcher: rejected host registration: {msg}"); + log::error!("statusnotifierwatcher: rejected host registration: {msg}")); return Err(fdo::Error::InvalidArgs(msg)); } let owner = hdr @@ -431,7 +432,7 @@ impl StatusNotifierWatcher { let is_new = self.register_host(&owner, host); if is_new { - eprintln!("statusnotifierwatcher: host registered: {host} (owner: {owner})"); + log::info!("statusnotifierwatcher: host registered: {host} (owner: {owner})")); let _ = Self::status_notifier_host_registered(&signal_emitter).await; } Ok(()) @@ -456,7 +457,7 @@ impl StatusNotifierWatcher { let was_present = self.unregister_host(&owner, host); if was_present { - eprintln!("statusnotifierwatcher: host unregistered: {host} (owner: {owner})"); + log::error!("statusnotifierwatcher: host unregistered: {host} (owner: {owner})")); } Ok(()) } @@ -534,32 +535,32 @@ async fn run_name_owner_changed_listener( let proxy = match DBusDaemonProxy::new(&connection).await { Ok(p) => p, Err(e) => { - eprintln!("statusnotifierwatcher: failed to create DBus proxy: {e}"); + log::error!("statusnotifierwatcher: failed to create DBus proxy: {e}")); return; } }; let signals = match proxy.receive_name_owner_changed().await { Ok(s) => s, Err(e) => { - eprintln!("statusnotifierwatcher: failed to subscribe to NameOwnerChanged: {e}"); + log::error!("statusnotifierwatcher: failed to subscribe to NameOwnerChanged: {e}")); return; } }; let object_path: ObjectPath<'_> = match OBJECT_PATH.try_into() { Ok(path) => path, Err(e) => { - eprintln!("statusnotifierwatcher: invalid object path {OBJECT_PATH}: {e}"); + log::error!("statusnotifierwatcher: invalid object path {OBJECT_PATH}: {e}")); return; } }; let signal_emitter = match SignalEmitter::new(&connection, object_path) { Ok(emitter) => emitter, Err(e) => { - eprintln!("statusnotifierwatcher: failed to create signal emitter: {e}"); + log::error!("statusnotifierwatcher: failed to create signal emitter: {e}")); return; } }; - eprintln!("statusnotifierwatcher: NameOwnerChanged listener active"); + log::info!("statusnotifierwatcher: NameOwnerChanged listener active")); // Consume the signal stream without pulling in futures-lite as a direct // dependency: zbus re-exports futures_core::Stream, and std provides // poll_fn + pin! for manual polling. @@ -577,7 +578,7 @@ async fn run_name_owner_changed_listener( if !purged.is_empty() { emit_purge_unregistered_signals(&signal_emitter, &purged).await; let removed = purged.items.len() + purged.hosts.len(); - eprintln!( + log::error!(); "statusnotifierwatcher: purged {removed} entries for vanished owner {}", args.old_owner ); @@ -641,14 +642,14 @@ async fn main() -> Result<(), Box> { .build() .await?; - eprintln!("statusnotifierwatcher: {BUS_NAME} registered on session bus"); + log::info!("statusnotifierwatcher: {BUS_NAME} registered on session bus")); // Spawn NameOwnerChanged listener that prunes entries on owner loss. tokio::spawn(run_name_owner_changed_listener(connection.clone(), watcher)); // Wait for shutdown signal let _ = shutdown_rx.changed().await; - eprintln!("statusnotifierwatcher: shutdown signal received, exiting cleanly"); + log::info!("statusnotifierwatcher: shutdown signal received, exiting cleanly")); drop(connection); Ok(()) } diff --git a/local/recipes/system/redbear-traceroute/source/Cargo.toml b/local/recipes/system/redbear-traceroute/source/Cargo.toml index 283475a28c..4e46114611 100644 --- a/local/recipes/system/redbear-traceroute/source/Cargo.toml +++ b/local/recipes/system/redbear-traceroute/source/Cargo.toml @@ -15,6 +15,8 @@ name = "redbear-traceroute" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" anyhow = "1" [target.'cfg(target_os = "redox")'.dependencies] diff --git a/local/recipes/system/redbear-traceroute/source/src/main.rs b/local/recipes/system/redbear-traceroute/source/src/main.rs index c906a943bc..2f6842b8dc 100644 --- a/local/recipes/system/redbear-traceroute/source/src/main.rs +++ b/local/recipes/system/redbear-traceroute/source/src/main.rs @@ -1,5 +1,6 @@ use anyhow::{bail, Context, Result}; use redbear_traceroute::{ +use log::{error, info, warn}; destination_port, format_reply_suffix, probe, resolve_destination, ProbeStatus, }; use std::env; @@ -143,8 +144,9 @@ fn run() -> Result<()> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); if let Err(err) = run() { - eprintln!("redbear-traceroute: {err}"); + log::error!("redbear-traceroute: {err}")); std::process::exit(1); } } diff --git a/local/recipes/system/redbear-udisks/source/Cargo.toml b/local/recipes/system/redbear-udisks/source/Cargo.toml index 258319d82f..0806d6dedb 100644 --- a/local/recipes/system/redbear-udisks/source/Cargo.toml +++ b/local/recipes/system/redbear-udisks/source/Cargo.toml @@ -11,6 +11,8 @@ name = "redbear-udisks" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" zbus = { version = "5", default-features = false, features = ["tokio"] } tokio = { version = "1", default-features = false, features = ["rt", "rt-multi-thread", "macros", "net", "time", "sync"] } serde = { version = "1", features = ["derive"] } diff --git a/local/recipes/system/redbear-udisks/source/src/interfaces.rs b/local/recipes/system/redbear-udisks/source/src/interfaces.rs index b7a58cfba7..d7b70487db 100644 --- a/local/recipes/system/redbear-udisks/source/src/interfaces.rs +++ b/local/recipes/system/redbear-udisks/source/src/interfaces.rs @@ -1,6 +1,7 @@ use std::{collections::{BTreeMap, HashMap}, sync::Arc}; use zbus::{ +use log::{error, info}; interface, object_server::SignalEmitter, zvariant::{OwnedObjectPath, Value}, @@ -227,7 +228,7 @@ impl BlockDeviceInterface { let state = self.block.mount_state.lock().map(|g| g.clone()).unwrap_or_default(); match crate::mount::mount(&self.block.device_path, &mountpoint, &state) { Ok(mounted_at) => { - eprintln!( + log::error!(); "redbear-udisks: mounted {} at {mounted_at} (fs={})", self.block.device_path, kind.as_str() @@ -250,7 +251,7 @@ impl BlockDeviceInterface { let state = self.block.mount_state.lock().map(|g| g.clone()).unwrap_or_default(); crate::mount::unmount(&state) .map_err(|err| zbus::fdo::Error::Failed(format!("unmount failed: {err}")))?; - eprintln!( + log::error!(); "redbear-udisks: unmounted {}", self.block.device_path ); diff --git a/local/recipes/system/redbear-udisks/source/src/main.rs b/local/recipes/system/redbear-udisks/source/src/main.rs index f5a67f7ce6..8756bfdcb8 100644 --- a/local/recipes/system/redbear-udisks/source/src/main.rs +++ b/local/recipes/system/redbear-udisks/source/src/main.rs @@ -3,6 +3,7 @@ mod inventory; mod mount; use std::{ +use log::{error, info, warn}; env, error::Error, process, @@ -44,7 +45,7 @@ async fn wait_for_dbus_socket() { } tokio::time::sleep(Duration::from_secs(1)).await; } - eprintln!("redbear-udisks: timed out waiting for D-Bus socket at {socket_path}"); + log::error!("redbear-udisks: timed out waiting for D-Bus socket at {socket_path}")); } fn parse_args() -> Result { @@ -123,19 +124,19 @@ async fn run_daemon() -> Result<(), Box> { match builder.build().await { Ok(connection) => { - eprintln!( + log::error!(); "redbear-udisks: registered {BUS_NAME} on the system bus ({} drives, {} blocks)", inventory.drives().len(), inventory.blocks().len(), ); let _ = shutdown_rx.changed().await; - eprintln!("redbear-udisks: shutdown signal received, exiting cleanly"); + log::info!("redbear-udisks: shutdown signal received, exiting cleanly")); drop(connection); return Ok(()); } Err(err) => { if attempt < 3 { - eprintln!( + log::error!(); "redbear-udisks: attempt {attempt}/3 failed ({err}), retrying in 1s..." ); tokio::time::sleep(Duration::from_secs(1)).await; @@ -152,27 +153,28 @@ async fn run_daemon() -> Result<(), Box> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); match parse_args() { Ok(Command::Help) => { - println!("{}", usage()); + log::info!("{}", usage())); } Ok(Command::Run) => { let runtime = match RuntimeBuilder::new_multi_thread().enable_all().build() { Ok(runtime) => runtime, Err(err) => { - eprintln!("redbear-udisks: failed to create tokio runtime: {err}"); + log::error!("redbear-udisks: failed to create tokio runtime: {err}")); process::exit(1); } }; if let Err(err) = runtime.block_on(run_daemon()) { - eprintln!("redbear-udisks: fatal error: {err}"); + log::error!("redbear-udisks: fatal error: {err}")); process::exit(1); } } Err(err) => { - eprintln!("redbear-udisks: {err}"); - eprintln!("{}", usage()); + log::error!("redbear-udisks: {err}")); + log::error!("{}", usage())); process::exit(1); } } diff --git a/local/recipes/system/redbear-upower/source/Cargo.toml b/local/recipes/system/redbear-upower/source/Cargo.toml index 7828eebc5f..9719988d27 100644 --- a/local/recipes/system/redbear-upower/source/Cargo.toml +++ b/local/recipes/system/redbear-upower/source/Cargo.toml @@ -11,6 +11,8 @@ name = "redbear-upower" path = "src/main.rs" [dependencies] +log = { version = "0.4", features = ["std"] } +env_logger = "0.11" zbus = { version = "5", default-features = false, features = ["tokio"] } # Minimal tokio feature set. Avoids the unstable tokio::signal::unix # backend on Redox (the `signal` feature pulls in libc::kill and a diff --git a/local/recipes/system/redbear-upower/source/src/main.rs b/local/recipes/system/redbear-upower/source/src/main.rs index a01b53395f..56568358c2 100644 --- a/local/recipes/system/redbear-upower/source/src/main.rs +++ b/local/recipes/system/redbear-upower/source/src/main.rs @@ -1,4 +1,5 @@ use std::{ +use log::{error, info, warn}; env, error::Error, fs, @@ -136,7 +137,7 @@ async fn wait_for_dbus_socket() { } tokio::time::sleep(Duration::from_secs(1)).await; } - eprintln!("redbear-upower: timed out waiting for D-Bus socket at {socket_path}"); + log::error!("redbear-upower: timed out waiting for D-Bus socket at {socket_path}")); } fn parse_object_path(path: &str) -> Result> { @@ -620,7 +621,7 @@ async fn run_daemon() -> Result<(), Box> { wait_for_dbus_socket().await; let runtime = PowerRuntime::discover()?; if !runtime.available() { - eprintln!( + log::error!(); "redbear-upower: /scheme/acpi/power unavailable; serving empty provisional UPower surface" ); } @@ -677,7 +678,7 @@ async fn run_daemon() -> Result<(), Box> { match builder.build().await { Ok(connection) => { - eprintln!("redbear-upower: registered {BUS_NAME} on the system bus"); + log::info!("redbear-upower: registered {BUS_NAME} on the system bus")); let upower_path = parse_object_path(UPOWER_PATH)?; let signal_emitter = SignalEmitter::new(&connection, upower_path)?; @@ -692,22 +693,22 @@ async fn run_daemon() -> Result<(), Box> { tokio::select! { result = shutdown_rx.changed() => { if result.is_err() { - eprintln!("redbear-upower: signal handler exited unexpectedly"); + log::info!("redbear-upower: signal handler exited unexpectedly")); } - eprintln!("redbear-upower: shutdown signal received, exiting cleanly"); + log::info!("redbear-upower: shutdown signal received, exiting cleanly")); break; } _ = notify_interval.tick() => { let drained = read_notifications(); if !drained.is_empty() { - eprintln!( + log::error!(); "redbear-upower: {} ACPI notification(s): {}", drained.len(), drained.join(", ") ); let current_snapshot = runtime.snapshot(); if current_snapshot != last_snapshot { - eprintln!( + log::error!(); "redbear-upower: power state changed after notification, emitting Changed signal" ); let _ = UPowerDaemon::changed(&signal_emitter).await; @@ -718,7 +719,7 @@ async fn run_daemon() -> Result<(), Box> { _ = poll_interval.tick() => { let current_snapshot = runtime.snapshot(); if current_snapshot != last_snapshot { - eprintln!( + log::error!(); "redbear-upower: power state changed, emitting Changed signal" ); let _ = UPowerDaemon::changed(&signal_emitter).await; @@ -733,7 +734,7 @@ async fn run_daemon() -> Result<(), Box> { } Err(err) => { if attempt < 3 { - eprintln!( + log::error!(); "redbear-upower: attempt {attempt}/3 failed ({err}), retrying in 1s..." ); tokio::time::sleep(Duration::from_secs(1)).await; @@ -750,27 +751,28 @@ async fn run_daemon() -> Result<(), Box> { } fn main() { + let _ = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).try_init(); match parse_args() { Ok(Command::Help) => { - println!("{}", usage()); + log::info!("{}", usage())); } Ok(Command::Run) => { let runtime = match RuntimeBuilder::new_multi_thread().enable_all().build() { Ok(runtime) => runtime, Err(err) => { - eprintln!("redbear-upower: failed to create tokio runtime: {err}"); + log::error!("redbear-upower: failed to create tokio runtime: {err}")); process::exit(1); } }; if let Err(err) = runtime.block_on(run_daemon()) { - eprintln!("redbear-upower: fatal error: {err}"); + log::error!("redbear-upower: fatal error: {err}")); process::exit(1); } } Err(err) => { - eprintln!("redbear-upower: {err}"); - eprintln!("{}", usage()); + log::error!("redbear-upower: {err}")); + log::error!("{}", usage())); process::exit(1); } } diff --git a/local/recipes/system/redbear-usb-hotplugd/Cargo.toml b/local/recipes/system/redbear-usb-hotplugd/Cargo.toml index a808aa40c4..7858ee6361 100644 --- a/local/recipes/system/redbear-usb-hotplugd/Cargo.toml +++ b/local/recipes/system/redbear-usb-hotplugd/Cargo.toml @@ -1,3 +1,22 @@ [workspace] members = ["source"] resolver = "3" + +[workspace.package] +version = "0.3.1" +edition = "2024" +license = "MIT" +repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" +rust-version = "1.89" + +[workspace.dependencies] +log = "0.4" +redox_syscall = { path = "../../../sources/syscall" } +libredox = { path = "../../../sources/libredox" } +redox-scheme = { path = "../../../sources/redox-scheme" } +xhcid = { path = "../../../sources/base/drivers/usb/xhcid" } +common = { path = "../../../sources/base/drivers/common" } + +[profile.release] +opt-level = 3 +lto = "thin" diff --git a/local/recipes/system/redbear-usb-hotplugd/source/Cargo.toml b/local/recipes/system/redbear-usb-hotplugd/source/Cargo.toml index 0173d8655c..f1934df937 100644 --- a/local/recipes/system/redbear-usb-hotplugd/source/Cargo.toml +++ b/local/recipes/system/redbear-usb-hotplugd/source/Cargo.toml @@ -1,21 +1,21 @@ [package] name = "redbear-usb-hotplugd" -version = "0.3.1" -description = "USB hotplug daemon for Red Bear OS" -repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" -license = "MIT" -edition = "2024" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +description = "USB device hotplug daemon" [[bin]] name = "redbear-usb-hotplugd" path = "src/main.rs" [dependencies] -log = "0.4" -redox_syscall = { path = "../../../../../local/sources/syscall" } -libredox = { path = "../../../../../local/sources/libredox", features = ["call", "std"] } -xhcid = { path = "../../../../../local/sources/base/drivers/usb/xhcid" } -common = { path = "../../../../../local/sources/base/drivers/common" } +log = { workspace = true } +redox_syscall = { workspace = true } +libredox = { workspace = true } +xhcid = { workspace = true } +common = { workspace = true } [patch.crates-io] redox_syscall = { path = "../../../../../local/sources/syscall" } diff --git a/local/recipes/system/redbear-usbaudiod/Cargo.toml b/local/recipes/system/redbear-usbaudiod/Cargo.toml index a808aa40c4..7858ee6361 100644 --- a/local/recipes/system/redbear-usbaudiod/Cargo.toml +++ b/local/recipes/system/redbear-usbaudiod/Cargo.toml @@ -1,3 +1,22 @@ [workspace] members = ["source"] resolver = "3" + +[workspace.package] +version = "0.3.1" +edition = "2024" +license = "MIT" +repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" +rust-version = "1.89" + +[workspace.dependencies] +log = "0.4" +redox_syscall = { path = "../../../sources/syscall" } +libredox = { path = "../../../sources/libredox" } +redox-scheme = { path = "../../../sources/redox-scheme" } +xhcid = { path = "../../../sources/base/drivers/usb/xhcid" } +common = { path = "../../../sources/base/drivers/common" } + +[profile.release] +opt-level = 3 +lto = "thin" diff --git a/local/recipes/system/redbear-usbaudiod/source/Cargo.toml b/local/recipes/system/redbear-usbaudiod/source/Cargo.toml index a0f9ca1a4c..c792c68f37 100644 --- a/local/recipes/system/redbear-usbaudiod/source/Cargo.toml +++ b/local/recipes/system/redbear-usbaudiod/source/Cargo.toml @@ -1,24 +1,24 @@ [package] name = "redbear-usbaudiod" -version = "0.3.1" -description = "USB audio daemon for Red Bear OS" -repository = "https://gitea.redbearos.org/vasilito/RedBear-OS" -license = "MIT" -edition = "2024" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +description = "USB Audio Class 1.0 driver daemon" [[bin]] name = "redbear-usbaudiod" path = "src/main.rs" [dependencies] -log = "0.4" -redox_syscall = { path = "../../../../../local/sources/syscall" } -xhcid = { path = "../../../../../local/sources/base/drivers/usb/xhcid" } -common = { path = "../../../../../local/sources/base/drivers/common" } -libredox = { path = "../../../../../local/sources/libredox", features = ["call", "std"] } +log = { workspace = true } +redox_syscall = { workspace = true } +xhcid = { workspace = true } +common = { workspace = true } +libredox = { workspace = true } [target.'cfg(target_os = "redox")'.dependencies] -redox-scheme = { path = "../../../../../local/sources/redox-scheme" } +redox-scheme = { workspace = true } [patch.crates-io] redox_syscall = { path = "../../../../../local/sources/syscall" } diff --git a/local/recipes/system/redbear-wifictl/source/Cargo.toml b/local/recipes/system/redbear-wifictl/source/Cargo.toml index 5581bc585d..f92a6c8c38 100644 --- a/local/recipes/system/redbear-wifictl/source/Cargo.toml +++ b/local/recipes/system/redbear-wifictl/source/Cargo.toml @@ -18,6 +18,7 @@ dbus-nm = ["dep:zbus"] libc = "0.2" libredox = { path = "../../../../../local/sources/libredox", features = ["call", "std"] } log = { version = "0.4", features = ["std"] } +env_logger = "0.11" redox-scheme = { path = "../../../../../local/sources/redox-scheme" } syscall = { path = "../../../../../local/sources/syscall", package = "redox_syscall", features = ["std"] } redox-driver-sys = { path = "../../../drivers/redox-driver-sys/source" } diff --git a/local/recipes/system/redbear-wifictl/source/src/main.rs b/local/recipes/system/redbear-wifictl/source/src/main.rs index b8c418cc57..1040529086 100644 --- a/local/recipes/system/redbear-wifictl/source/src/main.rs +++ b/local/recipes/system/redbear-wifictl/source/src/main.rs @@ -12,18 +12,12 @@ use std::process; use backend::{Backend, IntelBackend, NoDeviceBackend}; #[cfg(target_os = "redox")] use dbus_nm::register_nm_interface; -use log::LevelFilter; -#[cfg(target_os = "redox")] -use log::{error, info}; +use log::{LevelFilter, error, info, warn}; #[cfg(target_os = "redox")] use redox_scheme::{scheme::SchemeSync, SignalBehavior, Socket}; #[cfg(target_os = "redox")] use scheme::WifiCtlScheme; -fn init_logging(level: LevelFilter) { - log::set_max_level(level); -} - #[cfg(target_os = "redox")] unsafe fn get_init_notify_fd() -> Option { let Ok(value) = env::var("INIT_NOTIFY") else { @@ -190,14 +184,7 @@ mod tests { } fn main() { - let log_level = match env::var("REDBEAR_WIFICTL_LOG").as_deref() { - Ok("debug") => LevelFilter::Debug, - Ok("trace") => LevelFilter::Trace, - Ok("warn") => LevelFilter::Warn, - Ok("error") => LevelFilter::Error, - _ => LevelFilter::Info, - }; - init_logging(log_level); + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); let raw_args = env::args().skip(1).collect::>(); #[cfg(target_os = "redox")] @@ -226,7 +213,7 @@ fn main() { return; } Err(err) => { - eprintln!("redbear-wifictl: prepare failed for {}: {}", iface, err); + error!("prepare failed for {}: {}", iface, err); process::exit(1); } } @@ -256,7 +243,7 @@ fn main() { return; } Err(err) => { - eprintln!("redbear-wifictl: scan failed for {}: {}", iface, err); + error!("scan failed for {}: {}", iface, err); process::exit(1); } } @@ -271,10 +258,7 @@ fn main() { return; } Err(err) => { - eprintln!( - "redbear-wifictl: transport probe failed for {}: {}", - iface, err - ); + error!("transport probe failed for {}: {}", iface, err); process::exit(1); } } @@ -290,10 +274,7 @@ fn main() { return; } Err(err) => { - eprintln!( - "redbear-wifictl: transport init failed for {}: {}", - iface, err - ); + error!("transport init failed for {}: {}", iface, err); process::exit(1); } } @@ -309,10 +290,7 @@ fn main() { return; } Err(err) => { - eprintln!( - "redbear-wifictl: activate-nic failed for {}: {}", - iface, err - ); + error!("activate-nic failed for {}: {}", iface, err); process::exit(1); } } @@ -328,7 +306,7 @@ fn main() { return; } Err(err) => { - eprintln!("redbear-wifictl: retry failed for {}: {}", iface, err); + error!("retry failed for {}: {}", iface, err); process::exit(1); } } @@ -340,21 +318,15 @@ fn main() { let key = args.next().unwrap_or_default(); let mut backend = build_backend(); if let Err(err) = backend.prepare(&iface) { - eprintln!("redbear-wifictl: prepare failed for {}: {}", iface, err); + error!("prepare failed for {}: {}", iface, err); process::exit(1); } if let Err(err) = backend.init_transport(&iface) { - eprintln!( - "redbear-wifictl: transport init failed for {}: {}", - iface, err - ); + error!("transport init failed for {}: {}", iface, err); process::exit(1); } if let Err(err) = backend.activate(&iface) { - eprintln!( - "redbear-wifictl: activate-nic failed for {}: {}", - iface, err - ); + error!("activate-nic failed for {}: {}", iface, err); process::exit(1); } let state = backend::InterfaceState { @@ -373,7 +345,7 @@ fn main() { return; } Err(err) => { - eprintln!("redbear-wifictl: connect failed for {}: {}", iface, err); + error!("connect failed for {}: {}", iface, err); process::exit(1); } } @@ -382,21 +354,15 @@ fn main() { let iface = args.next().unwrap_or_else(|| "wlan0".to_string()); let mut backend = build_backend(); if let Err(err) = backend.prepare(&iface) { - eprintln!("redbear-wifictl: prepare failed for {}: {}", iface, err); + error!("prepare failed for {}: {}", iface, err); process::exit(1); } if let Err(err) = backend.init_transport(&iface) { - eprintln!( - "redbear-wifictl: transport init failed for {}: {}", - iface, err - ); + error!("transport init failed for {}: {}", iface, err); process::exit(1); } if let Err(err) = backend.activate(&iface) { - eprintln!( - "redbear-wifictl: activate-nic failed for {}: {}", - iface, err - ); + error!("activate-nic failed for {}: {}", iface, err); process::exit(1); } match backend.disconnect(&iface) { @@ -409,7 +375,7 @@ fn main() { return; } Err(err) => { - eprintln!("redbear-wifictl: disconnect failed for {}: {}", iface, err); + error!("disconnect failed for {}: {}", iface, err); process::exit(1); } } @@ -419,7 +385,7 @@ fn main() { #[cfg(not(target_os = "redox"))] { - eprintln!("redbear-wifictl: daemon mode is only supported on Redox; use --probe on host"); + error!("daemon mode is only supported on Redox; use --probe on host"); process::exit(1); } @@ -433,7 +399,7 @@ fn main() { let socket = match Socket::create() { Ok(s) => s, Err(err) => { - error!("redbear-wifictl: failed to create scheme socket: {err}"); + error!("failed to create scheme socket: {err}"); process::exit(1); } }; @@ -442,9 +408,9 @@ fn main() { notify_scheme_ready(notify_fd, &socket, &mut scheme); match libredox::call::setrens(0, 0) { - Ok(_) => info!("redbear-wifictl: registered scheme:wifictl"), + Ok(_) => info!("registered scheme:wifictl"), Err(err) => { - error!("redbear-wifictl: failed to enter null namespace: {err}"); + error!("failed to enter null namespace: {err}"); process::exit(1); } } @@ -454,11 +420,11 @@ fn main() { let request = match socket.next_request(SignalBehavior::Restart) { Ok(Some(req)) => req, Ok(None) => { - info!("redbear-wifictl: scheme socket closed, shutting down"); + info!("scheme socket closed, shutting down"); break; } Err(err) => { - error!("redbear-wifictl: failed to read scheme request: {err}"); + error!("failed to read scheme request: {err}"); exit_code = 1; break; } @@ -467,7 +433,7 @@ fn main() { redox_scheme::RequestKind::Call(request) => { let response = request.handle_sync(&mut scheme, &mut state); if let Err(err) = socket.write_response(response, SignalBehavior::Restart) { - error!("redbear-wifictl: failed to write response: {err}"); + error!("failed to write response: {err}"); exit_code = 1; break; } diff --git a/local/recipes/wayland/redbear-compositor/source/Cargo.toml b/local/recipes/wayland/redbear-compositor/source/Cargo.toml index 7695835bd4..cd75135cf8 100644 --- a/local/recipes/wayland/redbear-compositor/source/Cargo.toml +++ b/local/recipes/wayland/redbear-compositor/source/Cargo.toml @@ -7,6 +7,8 @@ license = "MIT" edition = "2024" [dependencies] +log = "0.4" +env_logger = "0.11" libc = "0.2" [[bin]] @@ -16,3 +18,6 @@ path = "src/main.rs" [[bin]] name = "redbear-compositor-check" path = "src/bin/redbear-compositor-check.rs" + +anyhow = "1" +thiserror = "2" diff --git a/local/recipes/wayland/redbear-compositor/source/src/display_backend.rs b/local/recipes/wayland/redbear-compositor/source/src/display_backend.rs index 8581d61a8e..12981c159e 100644 --- a/local/recipes/wayland/redbear-compositor/source/src/display_backend.rs +++ b/local/recipes/wayland/redbear-compositor/source/src/display_backend.rs @@ -19,7 +19,7 @@ pub struct DisplayBackend { impl DisplayBackend { pub fn open_or_framebuffer() -> Self { if let Some(drm) = drm_backend::DrmOutput::open() { - eprintln!( + log::info!( "redbear-compositor: using DRM/KMS output {}x{}", drm.width, drm.height ); @@ -47,7 +47,7 @@ impl DisplayBackend { let fb_phys_str = std::env::var("FRAMEBUFFER_ADDR").unwrap_or_else(|_| "0x80000000".into()); let fb_phys = usize::from_str_radix(fb_phys_str.trim_start_matches("0x"), 16).unwrap_or(0x80000000); - eprintln!( + log::info!( "redbear-compositor: fb {}x{} stride {} phys 0x{:X}", width, height, stride, fb_phys ); @@ -207,7 +207,7 @@ mod drm_backend { impl DrmOutput { pub fn open() -> Option { let mut file = File::open("/scheme/drm/card0").ok()?; - eprintln!("redbear-compositor: opened /scheme/drm/card0"); + log::info!("redbear-compositor: opened /scheme/drm/card0"); let mut resources_resp = vec![0u8; std::mem::size_of::() + 32]; if drm_ioctl(&mut file, DRM_IOCTL_BASE, &[], &mut resources_resp).is_err() { @@ -257,7 +257,7 @@ mod drm_backend { }; let width = mode.hdisplay as u32; let height = mode.vdisplay as u32; - eprintln!("redbear-compositor: DRM mode {}x{}", width, height); + log::info!("redbear-compositor: DRM mode {}x{}", width, height); let mut crtc_id = 1u32; if conn.encoder_id != 0 { @@ -409,7 +409,7 @@ mod drm_backend { return None; } - eprintln!( + log::info!( "redbear-compositor: DRM output {}x{} stride={} connector={} crtc={}", width, height, stride, connector_id, crtc_id ); @@ -435,7 +435,7 @@ mod drm_backend { buf.extend_from_slice(&(DRM_IOCTL_MODE_PAGE_FLIP as u64).to_le_bytes()); buf.extend_from_slice(&fb_id.to_le_bytes()); if let Err(e) = (&self.drm_file).write_all(&buf) { - eprintln!("redbear-compositor: DRM page flip ioctl failed: {}", e); + log::error!("redbear-compositor: DRM page flip ioctl failed: {}", e); } self.current.store(next, Ordering::Relaxed); } diff --git a/local/recipes/wayland/redbear-compositor/source/src/handlers.rs b/local/recipes/wayland/redbear-compositor/source/src/handlers.rs index 566f5d77e5..a9c8bf2d0b 100644 --- a/local/recipes/wayland/redbear-compositor/source/src/handlers.rs +++ b/local/recipes/wayland/redbear-compositor/source/src/handlers.rs @@ -22,7 +22,7 @@ impl Compositor { u32::from_le_bytes([payload[0], payload[1], payload[2], payload[3]]); let surface_id = u32::from_le_bytes([payload[4], payload[5], payload[6], payload[7]]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_SHELL_SURFACE); client.shell_surfaces.insert( @@ -68,7 +68,7 @@ impl Compositor { | protocol::WL_SHELL_SURFACE_SET_TITLE | protocol::WL_SHELL_SURFACE_SET_CLASS | protocol::WL_SHELL_SURFACE_MOVE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(shell_surface) = client.shell_surfaces.get_mut(&object_id) { match opcode { @@ -121,7 +121,7 @@ impl Compositor { } } _ => { - eprintln!("redbear-compositor: wl_shell_surface opcode {} dropped (short payload {} bytes)", opcode, payload.len()); + log::warn!("redbear-compositor: wl_shell_surface opcode {} dropped (short payload {} bytes)", opcode, payload.len()); } } @@ -150,7 +150,7 @@ impl Compositor { if payload.len() >= 4 { let new_id = u32::from_le_bytes([payload[0], payload[1], payload[2], payload[3]]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_DATA_SOURCE); client @@ -164,7 +164,7 @@ impl Compositor { if payload.len() >= 4 { let new_id = u32::from_le_bytes([payload[0], payload[1], payload[2], payload[3]]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_DATA_DEVICE); client @@ -191,7 +191,7 @@ impl Compositor { ) -> Result<(), String> { match opcode { WL_DATA_SOURCE_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.data_sources.remove(&object_id); @@ -201,7 +201,7 @@ impl Compositor { Ok(()) } WL_DATA_SOURCE_OFFER | WL_DATA_SOURCE_SET_ACTIONS => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(source) = client.data_sources.get_mut(&object_id) { match opcode { @@ -219,7 +219,7 @@ impl Compositor { ])); } _ => { - eprintln!("redbear-compositor: wl_data_source opcode {} dropped (short payload {} bytes)", opcode, payload.len()); + log::warn!("redbear-compositor: wl_data_source opcode {} dropped (short payload {} bytes)", opcode, payload.len()); } } } @@ -243,7 +243,7 @@ impl Compositor { ) -> Result<(), String> { match opcode { WL_DATA_DEVICE_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.data_devices.remove(&object_id); @@ -253,7 +253,7 @@ impl Compositor { Ok(()) } WL_DATA_DEVICE_START_DRAG | WL_DATA_DEVICE_SET_SELECTION => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(device) = client.data_devices.get_mut(&object_id) { match opcode { @@ -270,7 +270,7 @@ impl Compositor { device.selection_source = (source_id != 0).then_some(source_id); } _ => { - eprintln!("redbear-compositor: wl_data_device opcode {} dropped (short payload {} bytes)", opcode, payload.len()); + log::warn!("redbear-compositor: wl_data_device opcode {} dropped (short payload {} bytes)", opcode, payload.len()); } } } @@ -299,7 +299,7 @@ impl Compositor { u32::from_le_bytes([payload[4], payload[5], payload[6], payload[7]]); let parent_surface_id = u32::from_le_bytes([payload[8], payload[9], payload[10], payload[11]]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_SUBSURFACE); client.subsurfaces.insert( @@ -337,7 +337,7 @@ impl Compositor { stream: &mut UnixStream, ) -> Result<(), String> { if opcode == WL_SUBSURFACE_DESTROY { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.subsurfaces.remove(&object_id); @@ -347,7 +347,7 @@ impl Compositor { return Ok(()); } - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let mut restack: Option<(u32, u32, bool)> = None; if let Some(subsurface) = client.subsurfaces.get_mut(&object_id) { @@ -376,7 +376,7 @@ impl Compositor { )); } _ => { - eprintln!("redbear-compositor: wl_subsurface opcode {} dropped (short payload {} bytes)", opcode, payload.len()); + log::warn!("redbear-compositor: wl_subsurface opcode {} dropped (short payload {} bytes)", opcode, payload.len()); } } diff --git a/local/recipes/wayland/redbear-compositor/source/src/main.rs b/local/recipes/wayland/redbear-compositor/source/src/main.rs index 6f5c207476..1c02af4a86 100644 --- a/local/recipes/wayland/redbear-compositor/source/src/main.rs +++ b/local/recipes/wayland/redbear-compositor/source/src/main.rs @@ -272,7 +272,7 @@ mod drm_backend { impl DrmOutput { pub fn open() -> Option { let mut file = File::open("/scheme/drm/card0").ok()?; - eprintln!("redbear-compositor: opened /scheme/drm/card0"); + log::info!("redbear-compositor: opened /scheme/drm/card0"); let mut resources_resp = vec![0u8; std::mem::size_of::() + 32]; if drm_ioctl(&mut file, DRM_IOCTL_BASE, &[], &mut resources_resp).is_err() { @@ -323,7 +323,7 @@ mod drm_backend { }; let width = mode.hdisplay as u32; let height = mode.vdisplay as u32; - eprintln!("redbear-compositor: DRM mode {}x{}", width, height); + log::info!("redbear-compositor: DRM mode {}x{}", width, height); let mut crtc_id = 1u32; if conn.encoder_id != 0 { @@ -479,7 +479,7 @@ mod drm_backend { return None; } - eprintln!( + log::info!( "redbear-compositor: DRM output {}x{} stride={} connector={} crtc={}", width, height, stride, connector_id, crtc_id ); @@ -1580,7 +1580,7 @@ impl Compositor { fn with_toplevel_state_mut( &self, client_id: u32, toplevel_id: u32, f: F, ) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { for surface in client.surfaces.values_mut() { if let Some(SurfaceRole::Toplevel(ref mut ts)) = surface.role { @@ -1616,9 +1616,9 @@ impl Compositor { } fn disconnect_client(&self, client_id: u32, stream: &mut UnixStream, reason: &str) { - eprintln!("redbear-compositor: disconnecting client {}: {}", client_id, reason); + log::info!("redbear-compositor: disconnecting client {}: {}", client_id, reason); let _ = stream.shutdown(Shutdown::Both); - self.clients.lock().unwrap().remove(&client_id); + self.clients.lock().expect("clients lock").remove(&client_id); } fn write_event( @@ -1714,7 +1714,7 @@ impl Compositor { } pub fn run(&mut self) -> std::io::Result<()> { - eprintln!("redbear-compositor: listening on Wayland socket"); + log::info!("redbear-compositor: listening on Wayland socket"); let _ = std::fs::write( std::env::var("XDG_RUNTIME_DIR").unwrap_or_else(|_| "/tmp".into()) + "/compositor.status", @@ -1724,8 +1724,8 @@ impl Compositor { match stream { Ok(stream) => { let client_id = self.alloc_id(); - eprintln!("redbear-compositor: client {} connected", client_id); - self.clients.lock().unwrap().insert( + log::info!("redbear-compositor: client {} connected", client_id); + self.clients.lock().expect("clients lock").insert( client_id, ClientState { objects: HashMap::new(), @@ -1751,7 +1751,7 @@ impl Compositor { ); self.handle_client(client_id, stream); } - Err(e) => eprintln!("redbear-compositor: accept error: {}", e), + Err(e) => log::error!("redbear-compositor: accept error: {}", e), } } Ok(()) @@ -1821,13 +1821,13 @@ impl Compositor { loop { match recv_with_rights(&mut stream, &mut buf) { Ok((0, _)) => { - eprintln!("redbear-compositor: client {} disconnected", client_id); - self.clients.lock().unwrap().remove(&client_id); + log::info!("redbear-compositor: client {} disconnected", client_id); + self.clients.lock().expect("clients lock").remove(&client_id); break; } Ok((n, mut fds)) => { if let Err(e) = self.dispatch(client_id, &buf[..n], &mut fds, &mut stream) { - eprintln!("redbear-compositor: dispatch error: {}", e); + log::error!("redbear-compositor: dispatch error: {}", e); } while let Some(fd) = fds.pop_front() { let _ = unsafe { libc::close(fd) }; @@ -1835,12 +1835,12 @@ impl Compositor { let _ = self.drain_pending_feedbacks(client_id, &mut stream); } Err(e) => { - eprintln!("redbear-compositor: read error: {}", e); + log::error!("redbear-compositor: read error: {}", e); break; } } } - self.clients.lock().unwrap().remove(&client_id); + self.clients.lock().expect("clients lock").remove(&client_id); } fn dispatch( @@ -1902,7 +1902,7 @@ impl Compositor { let obj_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&obj_id); client.object_versions.remove(&obj_id); @@ -1917,7 +1917,7 @@ impl Compositor { let registry_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); let mut send_globals = false; if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(registry_id, OBJECT_TYPE_WL_REGISTRY); @@ -1930,7 +1930,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -1944,12 +1944,12 @@ impl Compositor { let requested_version = read_u32(payload, &mut cursor)?; let new_id = read_u32(payload, &mut cursor)?; - eprintln!( + log::info!( "redbear-compositor: client {} binds '{}' -> id {}", client_id, iface, new_id ); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let global_version = self .globals @@ -1975,7 +1975,7 @@ impl Compositor { "zwlr_layer_shell_v1" => OBJECT_TYPE_ZWLR_LAYER_SHELL_V1, "zwlr_output_manager_v1" => OBJECT_TYPE_ZWLR_OUTPUT_MANAGER_V1, _ => { - eprintln!( + log::info!( "redbear-compositor: unknown global interface '{}' bound to object {}", iface, new_id ); @@ -1997,7 +1997,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2009,7 +2009,7 @@ impl Compositor { let surface_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(surface_id, OBJECT_TYPE_WL_SURFACE); client.surfaces.insert( @@ -2035,7 +2035,7 @@ impl Compositor { let region_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(region_id, OBJECT_TYPE_WL_REGION); client.regions.insert(region_id, RegionState::default()); @@ -2043,7 +2043,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2063,7 +2063,7 @@ impl Compositor { })?; if size > 0 { let file = unsafe { std::fs::File::from_raw_fd(fd_val) }; - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(pool_id, OBJECT_TYPE_WL_SHM_POOL); client.shm_pools.insert( @@ -2080,7 +2080,7 @@ impl Compositor { } } WL_SHM_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -2088,7 +2088,7 @@ impl Compositor { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2132,7 +2132,7 @@ impl Compositor { WL_SHM_FORMAT_ARGB8888 }; - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(buffer_id, OBJECT_TYPE_WL_BUFFER); client.buffers.insert( @@ -2153,7 +2153,7 @@ impl Compositor { } } WL_SHM_POOL_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.shm_pools.remove(&object_id); @@ -2167,7 +2167,7 @@ impl Compositor { payload[0], payload[1], payload[2], payload[3], ]); if size > 0 { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(pool) = client.shm_pools.get_mut(&object_id) { pool.size = pool.size.max(size as usize); @@ -2177,7 +2177,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2185,7 +2185,7 @@ impl Compositor { }, OBJECT_TYPE_WL_SURFACE => match opcode { WL_SURFACE_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.surfaces.remove(&object_id); @@ -2208,7 +2208,7 @@ impl Compositor { payload[11], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let attached_buffer = if buffer_id == 0 { None @@ -2229,7 +2229,7 @@ impl Compositor { } WL_SURFACE_COMMIT => { let release_id = { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(surface) = client.surfaces.get_mut(&object_id) { let release_buffer = surface.pending_buffer_id; @@ -2279,7 +2279,7 @@ impl Compositor { // single full-screen composition surface. } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2291,14 +2291,14 @@ impl Compositor { let new_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_SHELL_SURFACE); } } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2309,7 +2309,7 @@ impl Compositor { // Client pong — accepted but compositor doesn't currently ping. } WL_SHELL_SURFACE_SET_TOPLEVEL => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let ss = client.shell_surfaces.entry(object_id).or_default(); ss.object_id = object_id; @@ -2333,7 +2333,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wl_shell_surface opcode {} on object {}", opcode, object_id ); @@ -2360,7 +2360,7 @@ impl Compositor { )) } }; - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, object_type); } @@ -2371,7 +2371,7 @@ impl Compositor { } } WL_SEAT_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.object_versions.remove(&object_id); @@ -2380,7 +2380,7 @@ impl Compositor { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2392,7 +2392,7 @@ impl Compositor { let new_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_XDG_POSITIONER); } @@ -2406,7 +2406,7 @@ impl Compositor { let surface_id = u32::from_le_bytes([ payload[4], payload[5], payload[6], payload[7], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_XDG_SURFACE); client.xdg_to_surface.insert(new_id, surface_id); @@ -2414,7 +2414,7 @@ impl Compositor { } } XDG_WM_BASE_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -2426,7 +2426,7 @@ impl Compositor { // pong keeps clients tolerant if a future watchdog starts doing so. } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2434,7 +2434,7 @@ impl Compositor { }, OBJECT_TYPE_XDG_SURFACE => match opcode { XDG_SURFACE_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -2446,7 +2446,7 @@ impl Compositor { let toplevel_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(toplevel_id, OBJECT_TYPE_XDG_TOPLEVEL); // Associate this toplevel with the parent xdg_surface's surface @@ -2470,7 +2470,7 @@ impl Compositor { let popup_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(popup_id, OBJECT_TYPE_XDG_POPUP); } @@ -2485,7 +2485,7 @@ impl Compositor { read_payload_i32(payload, 0), read_payload_i32(payload, 1), read_payload_i32(payload, 2), read_payload_i32(payload, 3), ) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(&surface_id) = client.xdg_to_surface.get(&object_id) { if let Some(surface) = client.surfaces.get_mut(&surface_id) { @@ -2497,7 +2497,7 @@ impl Compositor { } XDG_SURFACE_ACK_CONFIGURE => { if let Some(serial) = read_payload_u32(payload, 0) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(&surface_id) = client.xdg_to_surface.get(&object_id) { if let Some(surface) = client.surfaces.get_mut(&surface_id) { @@ -2508,7 +2508,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled opcode {} on object {}", opcode, object_id ); @@ -2516,7 +2516,7 @@ impl Compositor { }, OBJECT_TYPE_WL_OUTPUT => match opcode { WL_OUTPUT_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.object_versions.remove(&object_id); @@ -2525,7 +2525,7 @@ impl Compositor { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wl_output opcode {} on object {}", opcode, object_id ); @@ -2533,7 +2533,7 @@ impl Compositor { }, OBJECT_TYPE_WL_BUFFER => match opcode { WL_BUFFER_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.object_versions.remove(&object_id); @@ -2552,7 +2552,7 @@ impl Compositor { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wl_buffer opcode {} on object {}", opcode, object_id ); @@ -2560,7 +2560,7 @@ impl Compositor { }, OBJECT_TYPE_XDG_TOPLEVEL => match opcode { XDG_TOPLEVEL_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.object_versions.remove(&object_id); @@ -2656,7 +2656,7 @@ impl Compositor { self.send_xdg_toplevel_configure(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled xdg_toplevel opcode {} on object {}", opcode, object_id ); @@ -2664,7 +2664,7 @@ impl Compositor { }, OBJECT_TYPE_XDG_POSITIONER => match opcode { XDG_POSITIONER_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.object_versions.remove(&object_id); @@ -2675,7 +2675,7 @@ impl Compositor { } XDG_POSITIONER_SET_SIZE => { if let (Some(w), Some(h)) = (read_payload_i32(payload, 0), read_payload_i32(payload, 1)) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().size = Some((w, h)); } @@ -2686,7 +2686,7 @@ impl Compositor { read_payload_i32(payload, 0), read_payload_i32(payload, 1), read_payload_i32(payload, 2), read_payload_i32(payload, 3), ) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().anchor_rect = Some((x, y, w, h)); } @@ -2694,7 +2694,7 @@ impl Compositor { } XDG_POSITIONER_SET_ANCHOR => { if let Some(anchor) = read_payload_u32(payload, 0) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().anchor = Some(anchor); } @@ -2702,7 +2702,7 @@ impl Compositor { } XDG_POSITIONER_SET_GRAVITY => { if let Some(gravity) = read_payload_u32(payload, 0) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().gravity = Some(gravity); } @@ -2710,7 +2710,7 @@ impl Compositor { } XDG_POSITIONER_SET_CONSTRAINT_ADJUSTMENT => { if let Some(adj) = read_payload_u32(payload, 0) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().constraint_adjustment = Some(adj); } @@ -2718,7 +2718,7 @@ impl Compositor { } XDG_POSITIONER_SET_OFFSET => { if let (Some(x), Some(y)) = (read_payload_i32(payload, 0), read_payload_i32(payload, 1)) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().offset = Some((x, y)); } @@ -2733,7 +2733,7 @@ impl Compositor { let reactive = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]) != 0; - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().reactive = Some(reactive); } @@ -2744,7 +2744,7 @@ impl Compositor { // is computed against when no parent_configure // is set. Cross-referenced with wlroots. if let (Some(w), Some(h)) = (read_payload_i32(payload, 0), read_payload_i32(payload, 1)) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().parent_size = Some((w, h)); } @@ -2760,14 +2760,14 @@ impl Compositor { let serial = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.positioners.entry(object_id).or_default().parent_configure = Some(serial); } } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled xdg_positioner opcode {} on object {}", opcode, object_id ); @@ -2775,7 +2775,7 @@ impl Compositor { }, OBJECT_TYPE_XDG_POPUP => match opcode { XDG_POPUP_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.object_versions.remove(&object_id); @@ -2795,7 +2795,7 @@ impl Compositor { if payload.len() >= 8 { let _seat_id = read_payload_u32(payload, 0).unwrap_or(0); let serial = read_payload_u32(payload, 1).unwrap_or(0); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { for surface in client.surfaces.values_mut() { if let Some(SurfaceRole::Popup(ref mut ps)) = surface.role { @@ -2812,7 +2812,7 @@ impl Compositor { if payload.len() >= 8 { let positioner_id = read_payload_u32(payload, 0).unwrap_or(0); let token = read_payload_u32(payload, 1).unwrap_or(0); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let pos_state = client.positioners.get(&positioner_id).cloned(); if let Some(ps) = client.surfaces.values_mut() @@ -2840,7 +2840,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled xdg_popup opcode {} on object {}", opcode, object_id ); @@ -2848,7 +2848,7 @@ impl Compositor { }, OBJECT_TYPE_WL_POINTER => match opcode { WL_POINTER_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.object_versions.remove(&object_id); @@ -2863,7 +2863,7 @@ impl Compositor { read_payload_i32(payload, 2), read_payload_i32(payload, 3), ) { - let mut pointer_state = self.pointer_state.lock().unwrap(); + let mut pointer_state = self.pointer_state.lock().expect("pointer_state lock"); pointer_state.cursor_surface = if surface != 0 { Some(surface) } else { None }; pointer_state.cursor_serial = Some(serial); pointer_state.cursor_hotspot = (hotspot_x, hotspot_y); @@ -2877,7 +2877,7 @@ impl Compositor { read_payload_u32(payload, 0), read_payload_u32(payload, 2), ) { - let mut pointer_state = self.pointer_state.lock().unwrap(); + let mut pointer_state = self.pointer_state.lock().expect("pointer_state lock"); pointer_state.last_button_serial = Some(serial); pointer_state.last_button = Some(button); } @@ -2886,7 +2886,7 @@ impl Compositor { }, OBJECT_TYPE_WL_KEYBOARD => match opcode { WL_KEYBOARD_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -2895,7 +2895,7 @@ impl Compositor { } WL_KEYBOARD_KEY | WL_KEYBOARD_ENTER | WL_KEYBOARD_LEAVE | WL_KEYBOARD_MODIFIERS | WL_KEYBOARD_REPEAT_INFO => { // Keyboard events dispatched to focused client surface when input daemon is wired. - let mut keyboard_state = self.keyboard_state.lock().unwrap(); + let mut keyboard_state = self.keyboard_state.lock().expect("keyboard_state lock"); if opcode == WL_KEYBOARD_KEY { if let (Some(time), Some(keycode), Some(state)) = ( read_payload_u32(payload, 1), @@ -2943,7 +2943,7 @@ impl Compositor { }, OBJECT_TYPE_WL_TOUCH => match opcode { WL_TOUCH_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -2951,7 +2951,7 @@ impl Compositor { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zxdg_decoration_manager_v1 opcode {} on object {}", opcode, object_id ); @@ -2963,7 +2963,7 @@ impl Compositor { let new_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_DATA_SOURCE); } @@ -2974,14 +2974,14 @@ impl Compositor { let new_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_DATA_DEVICE); } } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled data_device_manager opcode {} on object {}", opcode, object_id ); @@ -2989,7 +2989,7 @@ impl Compositor { }, OBJECT_TYPE_ZXDG_DECORATION_MANAGER_V1 => match opcode { ZXDG_DECORATION_MANAGER_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3004,7 +3004,7 @@ impl Compositor { let toplevel_id = u32::from_le_bytes([ payload[4], payload[5], payload[6], payload[7], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_ZXDG_TOPLEVEL_DECORATION_V1); client.decorations.insert(new_id, toplevel_id); @@ -3019,7 +3019,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zxdg_toplevel_decoration_v1 opcode {} on object {}", opcode, object_id ); @@ -3027,7 +3027,7 @@ impl Compositor { }, OBJECT_TYPE_ZXDG_TOPLEVEL_DECORATION_V1 => match opcode { ZXDG_TOPLEVEL_DECORATION_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.decorations.remove(&object_id); @@ -3044,7 +3044,7 @@ impl Compositor { )?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wp_viewporter opcode {} on object {}", opcode, object_id ); @@ -3052,7 +3052,7 @@ impl Compositor { }, OBJECT_TYPE_WP_VIEWPORTER => match opcode { WP_VIEWPORTER_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3067,7 +3067,7 @@ impl Compositor { let surface_id = u32::from_le_bytes([ payload[4], payload[5], payload[6], payload[7], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WP_VIEWPORT); client.viewporters.insert(new_id, ViewportState::default()); @@ -3076,7 +3076,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wp_viewport opcode {} on object {}", opcode, object_id ); @@ -3084,7 +3084,7 @@ impl Compositor { }, OBJECT_TYPE_WP_VIEWPORT => match opcode { WP_VIEWPORT_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.viewporters.remove(&object_id); @@ -3100,7 +3100,7 @@ impl Compositor { read_payload_i32(payload, 2), read_payload_i32(payload, 3), ) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.viewporters.entry(object_id).or_default().source = Some((x, y, w, h)); } @@ -3108,14 +3108,14 @@ impl Compositor { } WP_VIEWPORT_SET_DESTINATION => { if let (Some(w), Some(h)) = (read_payload_i32(payload, 0), read_payload_i32(payload, 1)) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.viewporters.entry(object_id).or_default().destination = Some((w, h)); } } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wp_viewport opcode {} on object {}", opcode, object_id ); @@ -3123,7 +3123,7 @@ impl Compositor { }, OBJECT_TYPE_ZWP_LINUX_DMABUF_V1 => match opcode { ZWP_LINUX_DMABUF_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3135,7 +3135,7 @@ impl Compositor { let new_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_ZWP_LINUX_BUFFER_PARAMS_V1); client.dmabuf_params.insert(new_id, DmabufParamsState::default()); @@ -3156,7 +3156,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zwp_linux_dmabuf_v1 opcode {} on object {}", opcode, object_id ); @@ -3164,7 +3164,7 @@ impl Compositor { }, OBJECT_TYPE_ZWP_LINUX_BUFFER_PARAMS_V1 => match opcode { ZWP_LINUX_BUFFER_PARAMS_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.dmabuf_params.remove(&object_id); @@ -3180,7 +3180,7 @@ impl Compositor { let stride = u32::from_le_bytes([payload[12], payload[13], payload[14], payload[15]]); let modifier_hi = u32::from_le_bytes([payload[16], payload[17], payload[18], payload[19]]); let modifier_lo = u32::from_le_bytes([payload[20], payload[21], payload[22], payload[23]]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.dmabuf_params.entry(object_id).or_default().planes.push(DmabufPlane { fd: Some(fd), plane_idx: Some(plane_idx), offset: Some(offset), stride: Some(stride), modifier_hi: Some(modifier_hi), modifier_lo: Some(modifier_lo), @@ -3195,7 +3195,7 @@ impl Compositor { read_payload_u32(payload, 2), read_payload_u32(payload, 3), ) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let state = client.dmabuf_params.entry(object_id).or_default(); state.width = Some(_width); @@ -3207,7 +3207,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zwp_linux_buffer_params_v1 opcode {} on object {}", opcode, object_id ); @@ -3215,7 +3215,7 @@ impl Compositor { }, OBJECT_TYPE_WP_PRESENTATION => match opcode { WP_PRESENTATION_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3230,7 +3230,7 @@ impl Compositor { let surface_id = u32::from_le_bytes([ payload[4], payload[5], payload[6], payload[7], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WP_PRESENTATION_FEEDBACK); client.presentation_feedback.insert( @@ -3243,7 +3243,7 @@ impl Compositor { } drop(clients); let queue_time_nsec = clock_monotonic_nsec(); - self.pending_feedbacks.lock().unwrap().push(PendingFeedback { + self.pending_feedbacks.lock().expect("pending_feedbacks lock").push(PendingFeedback { client_id, feedback_id: new_id, surface_id, @@ -3252,7 +3252,7 @@ impl Compositor { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wp_presentation opcode {} on object {}", opcode, object_id ); @@ -3260,7 +3260,7 @@ impl Compositor { }, OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { WP_PRESENTATION_FEEDBACK_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.presentation_feedback.remove(&object_id); @@ -3269,7 +3269,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wp_presentation_feedback opcode {} on object {}", opcode, object_id ); @@ -3277,7 +3277,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_ZWLR_LAYER_SHELL_V1 => match opcode { ZWLR_LAYER_SHELL_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3295,7 +3295,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { let _layer = u32::from_le_bytes([ payload[8], payload[9], payload[10], payload[11], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_ZWLR_LAYER_SURFACE_V1); } @@ -3304,7 +3304,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zwlr_layer_shell_v1 opcode {} on object {}", opcode, object_id ); @@ -3312,7 +3312,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_ZWLR_LAYER_SURFACE_V1 => match opcode { ZWLR_LAYER_SURFACE_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3325,7 +3325,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { ]); } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zwlr_layer_surface_v1 opcode {} on object {}", opcode, object_id ); @@ -3333,7 +3333,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_ZWLR_OUTPUT_MANAGER_V1 => match opcode { ZWLR_OUTPUT_MANAGER_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3346,7 +3346,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { payload[0], payload[1], payload[2], payload[3], ]); let serial = self.next_serial(); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_ZWLR_OUTPUT_CONFIG_V1); } @@ -3355,7 +3355,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zwlr_output_manager_v1 opcode {} on object {}", opcode, object_id ); @@ -3363,7 +3363,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_ZWLR_OUTPUT_CONFIG_V1 => match opcode { ZWLR_OUTPUT_CONFIG_V1_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3377,7 +3377,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { self.send_output_config_succeeded(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled zwlr_output_config_v1 opcode {} on object {}", opcode, object_id ); @@ -3385,7 +3385,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_WL_DATA_SOURCE => match opcode { WL_DATA_SOURCE_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.data_sources.remove(&object_id); @@ -3395,7 +3395,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } WL_DATA_SOURCE_OFFER => { if let Some(mime_type) = read_payload_string(payload) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.data_sources.entry(object_id) .or_default() @@ -3406,14 +3406,14 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } WL_DATA_SOURCE_SET_ACTIONS => { if let Some(actions) = read_payload_u32(payload, 0) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.data_sources.entry(object_id).or_default().actions = Some(actions); } } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled data_source opcode {} on object {}", opcode, object_id ); @@ -3421,7 +3421,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_WL_DATA_DEVICE => match opcode { WL_DATA_DEVICE_RELEASE => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.data_devices.remove(&object_id); @@ -3437,7 +3437,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { if let Some(source_id) = read_payload_u32(payload, 0) { let new_offer_id = self.alloc_id(); let mime_types: Vec = { - let clients = self.clients.lock().unwrap(); + let clients = self.clients.lock().expect("clients lock"); clients .get(&client_id) .and_then(|c| c.data_sources.get(&source_id)) @@ -3445,20 +3445,20 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { .unwrap_or_default() }; let source_actions = { - let clients = self.clients.lock().unwrap(); + let clients = self.clients.lock().expect("clients lock"); clients .get(&client_id) .and_then(|c| c.data_sources.get(&source_id)) .and_then(|s| s.actions) }; let transfer_buffer = { - let clients = self.clients.lock().unwrap(); + let clients = self.clients.lock().expect("clients lock"); clients .get(&client_id) .and_then(|c| c.data_sources.get(&source_id)) .and_then(|s| s.buffer.clone()) }; - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_offer_id, OBJECT_TYPE_WL_DATA_OFFER); client.data_offers.insert( @@ -3525,7 +3525,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled data_device opcode {} on object {}", opcode, object_id ); @@ -3538,7 +3538,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { payload[0], payload[1], payload[2], payload[3], ]); let mime_type = read_payload_string(&payload[4..]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(offer) = client.data_offers.get_mut(&object_id) { let _ = serial; @@ -3551,7 +3551,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { if let Some(mime_bytes) = read_payload_string(payload) { let mime_str = mime_bytes.to_string(); let payload_bytes = { - let clients = self.clients.lock().unwrap(); + let clients = self.clients.lock().expect("clients lock"); clients .get(&client_id) .and_then(|c| c.data_offers.get(&object_id)) @@ -3597,7 +3597,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } WL_DATA_OFFER_FINISH => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(offer) = client.data_offers.get_mut(&object_id) { offer.finished = true; @@ -3605,7 +3605,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } WL_DATA_OFFER_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.data_offers.remove(&object_id); } @@ -3613,7 +3613,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled data_offer opcode {} on object {}", opcode, object_id ); @@ -3632,7 +3632,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { let parent_id = u32::from_le_bytes([ payload[8], payload[9], payload[10], payload[11], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.insert(new_id, OBJECT_TYPE_WL_SUBSURFACE); client.subsurfaces.insert(new_id, SubsurfaceState { @@ -3644,7 +3644,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } WL_SUBCOMPOSITOR_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3652,7 +3652,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { self.send_delete_id(client_id, stream, object_id)?; } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled subcompositor opcode {} on object {}", opcode, object_id ); @@ -3660,7 +3660,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_WL_SUBSURFACE => match opcode { WL_SUBSURFACE_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.subsurfaces.remove(&object_id); @@ -3670,7 +3670,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } WL_SUBSURFACE_SET_POSITION => { if let (Some(x), Some(y)) = (read_payload_i32(payload, 0), read_payload_i32(payload, 1)) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(ss) = client.subsurfaces.get_mut(&object_id) { ss.x = x; @@ -3681,7 +3681,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } WL_SUBSURFACE_PLACE_ABOVE => { if let Some(sibling_id) = read_payload_u32(payload, 0) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let sibling_z = client.subsurfaces.values() .find(|ss| ss.surface_id == sibling_id) @@ -3695,7 +3695,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } WL_SUBSURFACE_PLACE_BELOW => { if let Some(sibling_id) = read_payload_u32(payload, 0) { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let sibling_z = client.subsurfaces.values() .find(|ss| ss.surface_id == sibling_id) @@ -3708,7 +3708,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } WL_SUBSURFACE_SET_SYNC => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(ss) = client.subsurfaces.get_mut(&object_id) { ss.sync = true; @@ -3716,7 +3716,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } WL_SUBSURFACE_SET_DESYNC => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if let Some(ss) = client.subsurfaces.get_mut(&object_id) { ss.sync = false; @@ -3724,7 +3724,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wl_subsurface opcode {} on object {}", opcode, object_id ); @@ -3732,7 +3732,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } OBJECT_TYPE_WL_REGION => match opcode { WL_REGION_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); client.regions.remove(&object_id); @@ -3755,7 +3755,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { payload[12], payload[13], payload[14], payload[15], ]); let rect = Rect { x, y, w, h }; - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { let region = client .regions @@ -3775,7 +3775,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wl_region opcode {} on object {}", opcode, object_id ); @@ -3783,7 +3783,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { }, OBJECT_TYPE_WL_FIXES => match opcode { WL_FIXES_DESTROY => { - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.objects.remove(&object_id); } @@ -3795,7 +3795,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { let registry_id = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { if client.objects.get(®istry_id).copied() == Some(OBJECT_TYPE_WL_REGISTRY) @@ -3812,21 +3812,21 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { let name = u32::from_le_bytes([ payload[0], payload[1], payload[2], payload[3], ]); - let mut clients = self.clients.lock().unwrap(); + let mut clients = self.clients.lock().expect("clients lock"); if let Some(client) = clients.get_mut(&client_id) { client.acked_global_removals.insert(name); } } } _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled wl_fixes opcode {} on object {}", opcode, object_id ); } }, _ => { - eprintln!( + log::info!( "redbear-compositor: unhandled object {} opcode {}", object_id, opcode ); @@ -3868,13 +3868,13 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { % drm.buffers.len().max(1); fb_ptr = drm.buffer_ptr(idx) as *mut u8; } else { - let mut fb = self.fb_data.lock().unwrap(); + let mut fb = self.fb_data.lock().expect("fb_data lock"); fb_stride = self.fb_stride as usize; fb_ptr = fb.as_mut().as_mut_ptr(); drop(fb); // release lock before unsafe block } } else { - let mut fb = self.fb_data.lock().unwrap(); + let mut fb = self.fb_data.lock().expect("fb_data lock"); fb_stride = self.fb_stride as usize; fb_ptr = fb.as_mut().as_mut_ptr(); drop(fb); @@ -4130,7 +4130,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { let mut msg = Vec::with_capacity(28); push_header(&mut msg, keyboard_id, WL_KEYBOARD_MODIFIERS, 20); let (depressed, latched, locked, group) = { - let kb = self.keyboard_state.lock().unwrap(); + let kb = self.keyboard_state.lock().expect("keyboard_state lock"); (kb.depressed, kb.latched, kb.locked, kb.group) }; push_u32(&mut msg, self.next_serial()); @@ -4169,7 +4169,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { keyboard_id: u32, ) -> Result<(), String> { let (depressed, latched, locked, group) = { - let kb = self.keyboard_state.lock().unwrap(); + let kb = self.keyboard_state.lock().expect("keyboard_state lock"); (kb.depressed, kb.latched, kb.locked, kb.group) }; let mut msg = Vec::with_capacity(28); @@ -4189,7 +4189,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { locked: u32, group: u32, ) { - let mut kb = self.keyboard_state.lock().unwrap(); + let mut kb = self.keyboard_state.lock().expect("keyboard_state lock"); kb.depressed = depressed; kb.latched = latched; kb.locked = locked; @@ -4301,7 +4301,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { stream: &mut UnixStream, ) -> Result<(), String> { let drained: Vec = { - let mut queue = self.pending_feedbacks.lock().unwrap(); + let mut queue = self.pending_feedbacks.lock().expect("pending_feedbacks lock"); let mut matching = Vec::new(); for fb in queue.iter() { if fb.client_id == client_id { @@ -4332,7 +4332,7 @@ OBJECT_TYPE_WP_PRESENTATION_FEEDBACK => match opcode { frame_lo, )?; } else { - self.pending_feedbacks.lock().unwrap().push(PendingFeedback { + self.pending_feedbacks.lock().expect("pending_feedbacks lock").push(PendingFeedback { client_id: fb.client_id, feedback_id: fb.feedback_id, surface_id: fb.surface_id, @@ -4382,7 +4382,7 @@ fn main() { // Fall back to VESA framebuffer parameters from environment. let drm = drm_backend::DrmOutput::open(); let (fb_width, fb_height, fb_stride, fb_phys) = if let Some(ref d) = drm { - eprintln!( + log::info!( "redbear-compositor: using DRM/KMS output {}x{}", d.width, d.height ); @@ -4403,7 +4403,7 @@ fn main() { let fb_phys_str = std::env::var("FRAMEBUFFER_ADDR").unwrap_or_else(|_| "0x80000000".into()); let fb_phys = usize::from_str_radix(fb_phys_str.trim_start_matches("0x"), 16).unwrap_or(0x80000000); - eprintln!( + log::info!( "redbear-compositor: fb {}x{} stride {} phys 0x{:X}", fb_width, fb_height, fb_stride, fb_phys ); @@ -4421,11 +4421,11 @@ fn main() { ) { Ok(mut compositor) => { if let Err(e) = compositor.run() { - eprintln!("redbear-compositor: {}", e); + log::info!("redbear-compositor: {}", e); } } Err(e) => { - eprintln!("redbear-compositor: failed to start: {}", e); + log::error!("redbear-compositor: failed to start: {}", e); } }