forked from AbleOS/ableos
218 lines
6.1 KiB
Rust
218 lines
6.1 KiB
Rust
use crate::arch::drivers::sysinfo::master;
|
|
use crate::systeminfo::{KERNEL_VERSION, RELEASE_TYPE};
|
|
use crate::{time::fetch_time, KERNEL_STATE};
|
|
// use genfs::{Fs, OpenOptions};
|
|
use kernel::allocator::ALLOCATOR;
|
|
// use rhai::Engine;
|
|
use spin::Lazy;
|
|
use x86_64::instructions::interrupts::{disable, enable};
|
|
|
|
pub const RHAISHELL_VERSION: &str = "0.1.0";
|
|
|
|
pub static KEYBUFF: spin::Mutex<Vec<char>> = spin::Mutex::new(Vec::new());
|
|
pub static CURRENT_DIR: Lazy<spin::Mutex<String>> = Lazy::new(|| spin::Mutex::new("/".to_string()));
|
|
|
|
#[cfg(target_arch = "riscv64")]
|
|
pub fn shell() {}
|
|
|
|
// #[cfg(target_arch = "x86_64")]
|
|
// pub fn shell() {
|
|
// let _current_dir = "/".to_string();
|
|
// let engine = engine_construction();
|
|
// let mut scope = rhai::Scope::new();
|
|
|
|
// println!("Rhaishell v{}", RHAISHELL_VERSION);
|
|
|
|
// let mut buf = String::new();
|
|
// print!("> ");
|
|
|
|
// loop {
|
|
// match x86_64::instructions::interrupts::without_interrupts(|| KEYBUFF.lock().pop()) {
|
|
// Some('\n') => {
|
|
// if buf == "quit" {
|
|
// println!("Bye!");
|
|
// break;
|
|
// }
|
|
|
|
// match engine.eval_with_scope::<rhai::Dynamic>(&mut scope, &buf) {
|
|
// Ok(o) => println!("{o}"),
|
|
|
|
// Err(e) => println!("Eval error: {e}"),
|
|
// };
|
|
|
|
// buf.clear();
|
|
// print!("> ");
|
|
// }
|
|
// Some('\u{0008}') => {
|
|
// buf.pop();
|
|
// }
|
|
|
|
// Some('\u{0009}') => {
|
|
// buf.push(' ');
|
|
// buf.push(' ');
|
|
// buf.push(' ');
|
|
// buf.push(' ');
|
|
// }
|
|
|
|
// Some(chr) => buf.push(chr),
|
|
// None => (),
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
pub fn afetch() {
|
|
let kstate = KERNEL_STATE.lock();
|
|
|
|
let tick_time = fetch_time();
|
|
|
|
disable();
|
|
let allocator = ALLOCATOR.lock();
|
|
let size = allocator.size();
|
|
let used = allocator.used();
|
|
enable();
|
|
|
|
println!(
|
|
include_str!("balloon.txt"),
|
|
kstate.hostname,
|
|
RELEASE_TYPE,
|
|
KERNEL_VERSION,
|
|
tick_time,
|
|
master().unwrap().brand_string().unwrap(),
|
|
// "",
|
|
// mem
|
|
used,
|
|
size
|
|
);
|
|
drop(kstate);
|
|
}
|
|
|
|
pub fn set_hostname(name: String) {
|
|
let mut kstate = KERNEL_STATE.lock();
|
|
kstate.hostname = name;
|
|
}
|
|
|
|
/// Examine a memory pointer
|
|
pub fn peek_memory(ptr: i64) -> i64 {
|
|
unsafe { *(ptr as *const u8) as _ }
|
|
}
|
|
|
|
pub fn poke_memory(ptr: i64, val: i64) {
|
|
match val.try_into() {
|
|
Ok(val) => unsafe { *(ptr as *mut u8) = val },
|
|
Err(_) => error!("{val} cannot be converted into u8"),
|
|
}
|
|
}
|
|
|
|
// pub fn ls() {
|
|
// let current_dir = CURRENT_DIR.lock();
|
|
|
|
// let fs = &*FILE_SYSTEM.lock();
|
|
|
|
// let file = fs
|
|
// .open(current_dir.as_bytes(), OpenOptions::new().read(true))
|
|
// .unwrap();
|
|
|
|
// let mut files = file.directory().unwrap();
|
|
// println!("current dir: {}", *current_dir);
|
|
// while let Some(Ok(entry)) = files.next() {
|
|
// let inode_name = entry.name;
|
|
// let s = String::from_utf8_lossy(&inode_name);
|
|
// println!("{}", s);
|
|
// }
|
|
// }
|
|
|
|
pub fn log_dump() {
|
|
use crate::network::socket::SimpleSock;
|
|
use crate::relib::network::socket::Socket;
|
|
let log_socket_id = SimpleSock::grab_socket("Logger".to_string());
|
|
match log_socket_id {
|
|
Some(mut log_socket_id) => {
|
|
let log = log_socket_id.peek();
|
|
|
|
match log {
|
|
crate::network::socket::SocketReturns::ReadOk(ok) => {
|
|
for x in ok.iter() {
|
|
print!("{}", *x as char);
|
|
}
|
|
}
|
|
|
|
crate::network::socket::SocketReturns::ReadIndexOutOfBounds => todo!(),
|
|
crate::network::socket::SocketReturns::WriteOk => todo!(),
|
|
}
|
|
}
|
|
None => warn!("No socket found for Logger"),
|
|
}
|
|
}
|
|
|
|
// pub fn echo_file(path: String) {
|
|
// let mut current_dir = CURRENT_DIR.lock();
|
|
|
|
// let fs = &*FILE_SYSTEM.lock();
|
|
|
|
// current_dir.push_str(&path);
|
|
|
|
// let file = fs
|
|
// .open(current_dir.as_bytes(), OpenOptions::new().read(true))
|
|
// .unwrap();
|
|
|
|
// if file.is_dir() {
|
|
// println!("{} is a directory", path);
|
|
// } else {
|
|
// let mut file_contents = Vec::new();
|
|
|
|
// let _ret = file.read_to_end(&mut file_contents).unwrap();
|
|
|
|
// let file_contents_str = String::from_utf8_lossy(&file_contents);
|
|
|
|
// println!("{}", file_contents_str);
|
|
// }
|
|
// }
|
|
|
|
// pub fn change_directory(path: String) {
|
|
// let mut current_dir = CURRENT_DIR.lock();
|
|
|
|
// let _fs = &*FILE_SYSTEM.lock();
|
|
// if path == "." || path == ".." {
|
|
// let mut split_dir = current_dir.split('/').collect::<Vec<&str>>();
|
|
// let mut new_dir = String::new();
|
|
// split_dir.remove(split_dir.len() - 1);
|
|
// println!("{:?}", split_dir);
|
|
// if split_dir.is_empty() {
|
|
// new_dir = "/".to_string();
|
|
// } else {
|
|
// for x in split_dir {
|
|
// new_dir.push_str(x);
|
|
// new_dir.push('/');
|
|
// }
|
|
// }
|
|
// *current_dir = new_dir;
|
|
// } else {
|
|
// if !current_dir.ends_with('/') {
|
|
// current_dir.push('/');
|
|
// }
|
|
// current_dir.push_str(&path);
|
|
// }
|
|
// }
|
|
|
|
// fn engine_construction() -> Engine {
|
|
// let mut engine = rhai::Engine::new();
|
|
|
|
// engine.on_print(|x| println!("{}", x));
|
|
// engine.on_debug(|x, src, pos| {
|
|
// let src = src.unwrap_or("unknown");
|
|
// println!("DEBUG: {} at {:?}: {}", src, pos, x);
|
|
// debug!("{} at {:?}: {}", src, pos, x);
|
|
// });
|
|
|
|
// engine.register_fn("afetch", afetch);
|
|
// engine.register_fn("set_hostname", set_hostname);
|
|
// engine.register_fn("shutdown", shutdown);
|
|
// engine.register_fn("peek", peek_memory);
|
|
// engine.register_fn("poke", poke_memory);
|
|
// engine.register_fn("sloop", sloop);
|
|
// engine.register_fn("log_dump", log_dump);
|
|
// // engine.register_fn("ls", ls);
|
|
|
|
// engine
|
|
// }
|