chj_rustbin/io/
rawfdreader.rs

1// copy from https://stackoverflow.com/questions/55812291/bufreader-from-a-raw-fd
2
3use libc;
4use std::io::{Error, Read, Result};
5use std::os::unix::io::{FromRawFd, RawFd};
6
7pub struct RawFdReader {
8    fd: RawFd,
9}
10
11impl FromRawFd for RawFdReader {
12    unsafe fn from_raw_fd(fd: RawFd) -> Self {
13        Self { fd }
14    }
15}
16
17impl Read for RawFdReader {
18    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
19        assert!(buf.len() <= isize::max_value() as usize);
20        match unsafe { libc::read(self.fd, buf.as_mut_ptr() as _, buf.len()) } {
21            x if x < 0 => Err(Error::last_os_error()),
22            x => Ok(x as usize),
23        }
24    }
25}