• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! The following is derived from Rust's
2 //! library/std/src/sys/unix/io.rs
3 //! dca3f1b786efd27be3b325ed1e01e247aa589c3b.
4 
5 #![allow(unsafe_code)]
6 use super::super::c;
7 use core::marker::PhantomData;
8 use core::slice;
9 use linux_raw_sys::general::__kernel_size_t;
10 
11 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html>
12 #[derive(Copy, Clone)]
13 #[repr(transparent)]
14 pub struct IoSlice<'a> {
15     vec: c::iovec,
16     _p: PhantomData<&'a [u8]>,
17 }
18 
19 impl<'a> IoSlice<'a> {
20     /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.new>
21     #[inline]
new(buf: &'a [u8]) -> IoSlice<'a>22     pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
23         IoSlice {
24             vec: c::iovec {
25                 iov_base: buf.as_ptr() as *mut u8 as *mut c::c_void,
26                 iov_len: buf.len() as _,
27             },
28             _p: PhantomData,
29         }
30     }
31 
32     /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.advance>
33     #[inline]
advance(&mut self, n: usize)34     pub fn advance(&mut self, n: usize) {
35         if self.vec.iov_len < n as _ {
36             panic!("advancing IoSlice beyond its length");
37         }
38 
39         unsafe {
40             self.vec.iov_len -= n as __kernel_size_t;
41             self.vec.iov_base = self.vec.iov_base.add(n);
42         }
43     }
44 
45     /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSlice.html#method.as_slice>
46     #[inline]
as_slice(&self) -> &[u8]47     pub fn as_slice(&self) -> &[u8] {
48         unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len as usize) }
49     }
50 }
51 
52 /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html>
53 #[repr(transparent)]
54 pub struct IoSliceMut<'a> {
55     vec: c::iovec,
56     _p: PhantomData<&'a mut [u8]>,
57 }
58 
59 impl<'a> IoSliceMut<'a> {
60     /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.new>
61     #[inline]
new(buf: &'a mut [u8]) -> IoSliceMut<'a>62     pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
63         IoSliceMut {
64             vec: c::iovec {
65                 iov_base: buf.as_mut_ptr() as *mut c::c_void,
66                 iov_len: buf.len() as _,
67             },
68             _p: PhantomData,
69         }
70     }
71 
72     /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.advance>
73     #[inline]
advance(&mut self, n: usize)74     pub fn advance(&mut self, n: usize) {
75         if self.vec.iov_len < n as _ {
76             panic!("advancing IoSliceMut beyond its length");
77         }
78 
79         unsafe {
80             self.vec.iov_len -= n as __kernel_size_t;
81             self.vec.iov_base = self.vec.iov_base.add(n);
82         }
83     }
84 
85     /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.as_slice>
86     #[inline]
as_slice(&self) -> &[u8]87     pub fn as_slice(&self) -> &[u8] {
88         unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len as usize) }
89     }
90 
91     /// <https://doc.rust-lang.org/nightly/std/io/struct.IoSliceMut.html#method.as_slice_mut>
92     #[inline]
as_mut_slice(&mut self) -> &mut [u8]93     pub fn as_mut_slice(&mut self) -> &mut [u8] {
94         unsafe {
95             slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len as usize)
96         }
97     }
98 }
99