diff --git a/services/libs/jinux-std/src/syscall/writev.rs b/services/libs/jinux-std/src/syscall/writev.rs index 582d87fbf..b927988c9 100644 --- a/services/libs/jinux-std/src/syscall/writev.rs +++ b/services/libs/jinux-std/src/syscall/writev.rs @@ -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 { +pub fn sys_writev( + fd: FileDescripter, + io_vec_ptr: Vaddr, + io_vec_count: usize, +) -> Result { 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 { +fn do_sys_writev(fd: FileDescripter, io_vec_ptr: Vaddr, io_vec_count: usize) -> Result { 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::(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::(io_vec_ptr + i * core::mem::size_of::())?; + 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) }