From baaddd7ccf3cb37d915820599bc3fb8aaf3a72d6 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:39:23 +0200 Subject: [PATCH] init: Support reading env vars from /usr/lib/environment.d --- init/src/main.rs | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/init/src/main.rs b/init/src/main.rs index b917844863..5682cf4455 100644 --- a/init/src/main.rs +++ b/init/src/main.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use std::ffi::OsString; use std::path::Path; -use std::{env, io}; +use std::{env, fs, io}; use libredox::flag::{O_RDONLY, O_WRONLY}; @@ -64,6 +64,52 @@ fn switch_root(unit_store: &mut UnitStore, config: &mut InitConfig, prefix: &Pat ); unit_store.config_dirs = vec![prefix.join("lib").join("init.d"), etcdir.join("init.d")]; + + let env_dirs = &[ + prefix.join("lib").join("environment.d"), + etcdir.join("environment.d"), + ]; + match config::config_for_dirs(env_dirs) { + Ok(files) => { + for file in files { + match fs::read_to_string(&file) { + Ok(envs) => { + for env in envs.lines() { + if env.is_empty() || env.starts_with("#") { + continue; + } + let Some((key, value)) = env.split_once('=') else { + eprintln!( + "init: failed to parse env line from {}: {env:?}", + file.display(), + ); + continue; + }; + config + .envs + .insert(key.to_owned().into(), value.to_owned().into()); + } + } + Err(err) => { + eprintln!( + "init: failed to read environment from {}: {err}", + file.display(), + ); + } + } + } + } + Err(err) => { + eprintln!( + "init: failed to read environments from {}: {err}", + env_dirs + .iter() + .map(|dir| dir.display().to_string()) + .collect::>() + .join(", ") + ); + } + } } fn main() {