rustubs/kthread/
kshell.rs1use crate::io::{back_space, read_key};
3use crate::kthread::KThread;
4use crate::proc::exec::exec;
5use crate::proc::task::Task;
6use crate::{fs::*, io};
7use alloc::vec::Vec;
8use core::str;
9pub struct Kshell {}
10
11impl KThread for Kshell {
12 fn entry() -> ! {
13 let fsarchive = get_archive();
14 let files = ustar::iter(fsarchive).collect();
15 event_loop(&files);
16 }
17}
18
19fn event_loop(files: &Vec<File>) -> ! {
20 let mut input_buffer = Vec::<u8>::new();
21 print!("$ ");
22 loop {
23 let k = read_key().asc;
24 match k {
25 0x8 => {
26 if input_buffer.pop().is_some() {
28 back_space();
29 }
30 }
31 0xa => {
32 println!();
34 let cmd: &str = str::from_utf8(&input_buffer).unwrap();
35 handle(cmd, files);
36 input_buffer.clear();
37 print!("$ ");
38 }
39 _ => {
40 print!("{}", k as char);
41 input_buffer.push(k)
42 }
43 }
44 }
45}
46
47#[allow(clippy::ptr_arg)]
49fn handle(cmd: &str, files: &Vec<File>) {
50 let tokens: Vec<&str> = cmd.split(' ').collect();
51 match tokens[0] {
52 "ls" => files.iter().for_each(|f| println!("{}", f.hdr.name())),
53 "cat" | "readelf" => {
54 if tokens.len() < 2 {
55 println!("need file name");
56 return;
57 }
58 let file_name = tokens[1];
59 if let Some(file) = files.iter().find(|f| f.hdr.name() == file_name)
60 {
61 cat(file)
62 } else {
63 println!("{}: no such file or directory", file_name,);
64 }
65 }
66 "" => {
67 return;
68 }
69 "clear" => {
70 io::reset_screen();
71 }
72 "mem" => {
73 let mm = &Task::current().unwrap().mm;
74 for vma in &mm.vmas {
75 println!("{:#?}", vma);
76 }
77 }
78 whatever => {
79 exec(whatever);
80 let mm = &Task::current().unwrap().mm;
81 for vma in &mm.vmas {
82 println!("{:#?}", vma);
83 }
84 }
85 }
86}