Skip to content

Commit 1f75719

Browse files
committed
Adds kern_writev wrapper
1 parent 4f8cdfc commit 1f75719

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

src/fd/mod.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::errno::Errno;
22
use crate::fcntl::OpenFlags;
33
use crate::pcpu::Pcpu;
44
use crate::thread::Thread;
5-
use crate::uio::UioSeg;
5+
use crate::uio::{IoVec, Uio, UioRw, UioSeg};
66
use crate::Kernel;
77
use core::ffi::{c_char, c_int};
88
use core::marker::PhantomData;
@@ -30,6 +30,33 @@ pub unsafe fn openat<K: Kernel>(
3030
}
3131
}
3232

33+
/// # Safety
34+
/// - `buf` cannot be null and must be valid up to `len` if `seg` is [`UioSeg::Kernel`].
35+
/// - `td` cannot be null.
36+
pub unsafe fn write<K: Kernel>(
37+
kern: K,
38+
fd: c_int,
39+
buf: *const u8,
40+
seg: UioSeg,
41+
len: usize,
42+
td: *mut K::Thread,
43+
) -> Result<usize, Errno> {
44+
// Setup iovec.
45+
let mut vec = IoVec {
46+
ptr: buf.cast_mut(),
47+
len,
48+
};
49+
50+
// Write.
51+
let mut uio = K::Uio::new(td, UioRw::Write, seg, &mut vec, 1).unwrap();
52+
let errno = kern.kern_writev(td, fd, &mut uio);
53+
54+
match Errno::new(errno) {
55+
Some(v) => Err(v),
56+
None => Ok((*td).ret(0)),
57+
}
58+
}
59+
3360
/// RAII struct to call [`Kernel::kern_close()`] when dropped.
3461
pub struct OwnedFd<K: Kernel> {
3562
kern: K,

0 commit comments

Comments
 (0)