mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 09:53:24 +00:00
Reimplement writev
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
0018ac4d63
commit
809e477bdf
@ -1,3 +1,4 @@
|
||||
use crate::fs::file_table::FileDescripter;
|
||||
use crate::{log_syscall_entry, prelude::*};
|
||||
|
||||
use crate::syscall::SYS_WRITEV;
|
||||
@ -14,34 +15,41 @@ pub struct IoVec {
|
||||
len: usize,
|
||||
}
|
||||
|
||||
pub fn sys_writev(fd: u64, io_vec_ptr: u64, io_vec_count: u64) -> Result<SyscallReturn> {
|
||||
pub fn sys_writev(
|
||||
fd: FileDescripter,
|
||||
io_vec_ptr: Vaddr,
|
||||
io_vec_count: usize,
|
||||
) -> Result<SyscallReturn> {
|
||||
log_syscall_entry!(SYS_WRITEV);
|
||||
let res = do_sys_writev(fd, io_vec_ptr as Vaddr, io_vec_count as usize)?;
|
||||
let res = do_sys_writev(fd, io_vec_ptr, io_vec_count)?;
|
||||
Ok(SyscallReturn::Return(res as _))
|
||||
}
|
||||
|
||||
pub fn do_sys_writev(fd: u64, io_vec_ptr: Vaddr, io_vec_count: usize) -> Result<usize> {
|
||||
fn do_sys_writev(fd: FileDescripter, io_vec_ptr: Vaddr, io_vec_count: usize) -> Result<usize> {
|
||||
debug!(
|
||||
"fd = {}, io_vec_ptr = 0x{:x}, io_vec_counter = 0x{:x}",
|
||||
fd, io_vec_ptr, io_vec_count
|
||||
);
|
||||
let mut write_len = 0;
|
||||
let file = {
|
||||
let current = current!();
|
||||
let filetable = current.file_table().lock();
|
||||
filetable.get_file(fd)?.clone()
|
||||
};
|
||||
let mut total_len = 0;
|
||||
for i in 0..io_vec_count {
|
||||
let io_vec = read_val_from_user::<IoVec>(io_vec_ptr + i * 16)?;
|
||||
let base = io_vec.base;
|
||||
let len = io_vec.len;
|
||||
let mut buffer = vec![0u8; len];
|
||||
read_bytes_from_user(base, &mut buffer)?;
|
||||
let content = alloc::str::from_utf8(&buffer).unwrap();
|
||||
write_len += len;
|
||||
if fd == 1 {
|
||||
print!("{}", content);
|
||||
} else if fd == 2 {
|
||||
print!("{}", content);
|
||||
} else {
|
||||
info!("content = {}", content);
|
||||
panic!("Unsupported fd {}", fd);
|
||||
let io_vec = read_val_from_user::<IoVec>(io_vec_ptr + i * core::mem::size_of::<IoVec>())?;
|
||||
if io_vec.base == 0 {
|
||||
continue;
|
||||
}
|
||||
let buffer = {
|
||||
let base = io_vec.base;
|
||||
let len = io_vec.len;
|
||||
let mut buffer = vec![0u8; len];
|
||||
read_bytes_from_user(base, &mut buffer)?;
|
||||
buffer
|
||||
};
|
||||
let write_len = file.write(&buffer)?;
|
||||
total_len += write_len;
|
||||
}
|
||||
Ok(write_len)
|
||||
Ok(total_len)
|
||||
}
|
||||
|
Reference in New Issue
Block a user