os/syscall/
fs.rs

1//! File and filesystem-related syscalls
2use crate::mm::translated_byte_buffer;
3use crate::sbi::console_getchar;
4use crate::task::{current_user_token, suspend_current_and_run_next};
5
6const FD_STDIN: usize = 0;
7const FD_STDOUT: usize = 1;
8
9pub fn sys_write(fd: usize, buf: *const u8, len: usize) -> isize {
10    match fd {
11        FD_STDOUT => {
12            let buffers = translated_byte_buffer(current_user_token(), buf, len);
13            for buffer in buffers {
14                print!("{}", core::str::from_utf8(buffer).unwrap());
15            }
16            len as isize
17        }
18        _ => {
19            panic!("Unsupported fd in sys_write!");
20        }
21    }
22}
23
24pub fn sys_read(fd: usize, buf: *const u8, len: usize) -> isize {
25    match fd {
26        FD_STDIN => {
27            assert_eq!(len, 1, "Only support len = 1 in sys_read!");
28            let mut c: usize;
29            loop {
30                c = console_getchar();
31                if c == 0 {
32                    suspend_current_and_run_next();
33                    continue;
34                } else {
35                    break;
36                }
37            }
38            let ch = c as u8;
39            let mut buffers = translated_byte_buffer(current_user_token(), buf, len);
40            unsafe {
41                buffers[0].as_mut_ptr().write_volatile(ch);
42            }
43            1
44        }
45        _ => {
46            panic!("Unsupported fd in sys_read!");
47        }
48    }
49}