mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 18:03:25 +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::{log_syscall_entry, prelude::*};
|
||||||
|
|
||||||
use crate::syscall::SYS_WRITEV;
|
use crate::syscall::SYS_WRITEV;
|
||||||
@ -14,34 +15,41 @@ pub struct IoVec {
|
|||||||
len: usize,
|
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);
|
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 _))
|
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!(
|
debug!(
|
||||||
"fd = {}, io_vec_ptr = 0x{:x}, io_vec_counter = 0x{:x}",
|
"fd = {}, io_vec_ptr = 0x{:x}, io_vec_counter = 0x{:x}",
|
||||||
fd, io_vec_ptr, io_vec_count
|
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 {
|
for i in 0..io_vec_count {
|
||||||
let io_vec = read_val_from_user::<IoVec>(io_vec_ptr + i * 16)?;
|
let io_vec = read_val_from_user::<IoVec>(io_vec_ptr + i * core::mem::size_of::<IoVec>())?;
|
||||||
let base = io_vec.base;
|
if io_vec.base == 0 {
|
||||||
let len = io_vec.len;
|
continue;
|
||||||
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 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