strat9_kernel/shell/commands/util/
env.rs1use 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
7pub 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
18pub fn shell_getenv(key: &str) -> Option<String> {
20 SHELL_ENV.lock().as_ref().and_then(|m| m.get(key).cloned())
21}
22
23pub 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
30pub fn shell_unsetenv(key: &str) {
32 if let Some(map) = SHELL_ENV.lock().as_mut() {
33 map.remove(key);
34 }
35}
36
37pub 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
53pub 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
70pub 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}