Skip to main content

strat9_kernel/shell/commands/util/
env.rs

1use super::*;
2use alloc::{collections::BTreeMap, string::String};
3
4static SHELL_ENV: crate::sync::SpinLock<Option<BTreeMap<String, String>>> =
5    crate::sync::SpinLock::new(None);
6
7/// Initialize kernel shell environment with default values.
8pub fn init_shell_env() {
9    let mut map = BTreeMap::new();
10    map.insert(String::from("KERNEL"), String::from("strat9"));
11    map.insert(String::from("ARCH"), String::from("x86_64"));
12    map.insert(String::from("SHELL"), String::from("chevron"));
13    map.insert(String::from("HOME"), String::from("/"));
14    map.insert(String::from("PATH"), String::from("/initfs/bin"));
15    *SHELL_ENV.lock() = Some(map);
16}
17
18/// Get a shell environment variable by key.
19pub fn shell_getenv(key: &str) -> Option<String> {
20    SHELL_ENV.lock().as_ref().and_then(|m| m.get(key).cloned())
21}
22
23/// Set a shell environment variable.
24pub fn shell_setenv(key: &str, val: &str) {
25    let mut guard = SHELL_ENV.lock();
26    let map = guard.get_or_insert_with(BTreeMap::new);
27    map.insert(String::from(key), String::from(val));
28}
29
30/// Remove a shell environment variable.
31pub fn shell_unsetenv(key: &str) {
32    if let Some(map) = SHELL_ENV.lock().as_mut() {
33        map.remove(key);
34    }
35}
36
37/// Display all shell environment variables.
38pub fn cmd_env(_args: &[String]) -> Result<(), ShellError> {
39    if let Some(map) = SHELL_ENV.lock().as_ref() {
40        for (k, v) in map.iter() {
41            shell_println!("{}={}", k, v);
42        }
43    }
44
45    let ticks = crate::process::scheduler::ticks();
46    let hz = crate::arch::x86_64::timer::TIMER_HZ;
47    shell_println!("UPTIME_SECS={}", ticks / hz);
48    shell_println!("SILO_COUNT={}", crate::silo::list_silos_snapshot().len());
49    shell_println!("MOUNT_COUNT={}", vfs::list_mounts().len());
50    Ok(())
51}
52
53/// Set a shell environment variable: `setenv KEY=VALUE`.
54pub fn cmd_setenv(args: &[String]) -> Result<(), ShellError> {
55    if args.is_empty() {
56        shell_println!("Usage: setenv KEY=VALUE");
57        return Err(ShellError::InvalidArguments);
58    }
59    let arg = &args[0];
60    if let Some(eq_pos) = arg.find('=') {
61        let key = &arg[..eq_pos];
62        let val = &arg[eq_pos + 1..];
63        shell_setenv(key, val);
64    } else {
65        shell_setenv(arg, "");
66    }
67    Ok(())
68}
69
70/// Remove a shell environment variable: `unsetenv KEY`.
71pub fn cmd_unsetenv(args: &[String]) -> Result<(), ShellError> {
72    if args.is_empty() {
73        shell_println!("Usage: unsetenv KEY");
74        return Err(ShellError::InvalidArguments);
75    }
76    shell_unsetenv(&args[0]);
77    Ok(())
78}