xref: /drstd/src/std/sys/unix/io.rs (revision 0fe3ff0054d3aec7fbf9bddecfecb10bc7d23a51)
1 use crate::std::marker::PhantomData;
2 use crate::std::os::fd::{AsFd, AsRawFd};
3 use crate::std::slice;
4 
5 use dlibc;
6 use dlibc::{c_void, iovec};
7 
8 #[derive(Copy, Clone)]
9 #[repr(transparent)]
10 pub struct IoSlice<'a> {
11     vec: iovec,
12     _p: PhantomData<&'a [u8]>,
13 }
14 
15 impl<'a> IoSlice<'a> {
16     #[inline]
17     pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
18         IoSlice {
19             vec: iovec {
20                 iov_base: buf.as_ptr() as *mut u8 as *mut c_void,
21                 iov_len: buf.len(),
22             },
23             _p: PhantomData,
24         }
25     }
26 
27     #[inline]
28     pub fn advance(&mut self, n: usize) {
29         if self.vec.iov_len < n {
30             panic!("advancing IoSlice beyond its length");
31         }
32 
33         unsafe {
34             self.vec.iov_len -= n;
35             self.vec.iov_base = self.vec.iov_base.add(n);
36         }
37     }
38 
39     #[inline]
40     pub fn as_slice(&self) -> &[u8] {
41         unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
42     }
43 }
44 
45 #[repr(transparent)]
46 pub struct IoSliceMut<'a> {
47     vec: iovec,
48     _p: PhantomData<&'a mut [u8]>,
49 }
50 
51 impl<'a> IoSliceMut<'a> {
52     #[inline]
53     pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
54         IoSliceMut {
55             vec: iovec {
56                 iov_base: buf.as_mut_ptr() as *mut c_void,
57                 iov_len: buf.len(),
58             },
59             _p: PhantomData,
60         }
61     }
62 
63     #[inline]
64     pub fn advance(&mut self, n: usize) {
65         if self.vec.iov_len < n {
66             panic!("advancing IoSliceMut beyond its length");
67         }
68 
69         unsafe {
70             self.vec.iov_len -= n;
71             self.vec.iov_base = self.vec.iov_base.add(n);
72         }
73     }
74 
75     #[inline]
76     pub fn as_slice(&self) -> &[u8] {
77         unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
78     }
79 
80     #[inline]
81     pub fn as_mut_slice(&mut self) -> &mut [u8] {
82         unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
83     }
84 }
85 
86 pub fn is_terminal(fd: &impl AsFd) -> bool {
87     let fd = fd.as_fd();
88     unsafe { dlibc::isatty(fd.as_raw_fd()) != 0 }
89 }
90