mirror of
https://gitlab.com/fabinfra/fabaccess/bffh.git
synced 2025-03-13 08:31:42 +01:00
47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
use std::cell::Cell;
|
|
use std::io::IoSliceMut;
|
|
use std::os::unix::prelude::RawFd;
|
|
use std::pin::Pin;
|
|
use std::task::{Context, Poll};
|
|
use futures_io::AsyncRead;
|
|
use crate::completion::Completion;
|
|
use crate::ctypes::IORING_OP;
|
|
use crate::io_uring::IoUring;
|
|
use crate::sqe::{SQE, SQEs};
|
|
use crate::submission::Submission;
|
|
|
|
pub struct File {
|
|
fd: RawFd,
|
|
submission: Submission,
|
|
}
|
|
|
|
impl File {
|
|
pub fn new(fd: RawFd, io_uring: &'static IoUring) -> Self {
|
|
Self { fd, submission: Submission::new(io_uring) }
|
|
}
|
|
|
|
fn prepare_read<'sq>(
|
|
fd: RawFd,
|
|
buf: &mut [u8],
|
|
sqes: &mut SQEs<'sq>,
|
|
) -> SQE<'sq>
|
|
{
|
|
let mut sqe = sqes.next().expect("prepare_read requires at least one SQE");
|
|
sqe.set_opcode(IORING_OP::READ);
|
|
sqe.set_address(buf.as_ptr() as u64);
|
|
sqe.set_fd(fd);
|
|
sqe.set_len(buf.len() as i32);
|
|
sqe
|
|
}
|
|
}
|
|
|
|
impl AsyncRead for File {
|
|
fn poll_read(mut self: Pin<&mut Self>, ctx: &mut Context<'_>, buf: &mut [u8])
|
|
-> Poll<std::io::Result<usize>>
|
|
{
|
|
let fd = self.fd;
|
|
Pin::new(&mut self.submission).poll(ctx, 1, |sqes| {
|
|
Self::prepare_read(fd, buf, sqes)
|
|
}).map(|res| res.map(|val| val as usize))
|
|
}
|
|
} |