use crate::sys;
use std::os::unix::io::RawFd;
pub trait PrepareOp {
fn prepare(&self, sqe: &mut sys::io_uring_sqe);
}
pub struct Read {
pub fd: RawFd,
pub buf: *mut u8,
pub len: u32,
pub offset: u64,
}
impl Read {
pub unsafe fn new(fd: RawFd, buf: *mut u8, len: u32, offset: u64) -> Self {
Self {
fd,
buf,
len,
offset,
}
}
pub fn from_slice(fd: RawFd, buf: &mut [u8], offset: u64) -> Self {
Self {
fd,
buf: buf.as_mut_ptr(),
len: buf.len() as u32,
offset,
}
}
}
impl PrepareOp for Read {
fn prepare(&self, sqe: &mut sys::io_uring_sqe) {
unsafe {
sys::io_uring_prep_read(
sqe,
self.fd,
self.buf as *mut std::ffi::c_void,
self.len,
self.offset,
);
}
}
}
pub struct Write {
pub fd: RawFd,
pub buf: *const u8,
pub len: u32,
pub offset: u64,
}
impl Write {
pub unsafe fn new(fd: RawFd, buf: *const u8, len: u32, offset: u64) -> Self {
Self {
fd,
buf,
len,
offset,
}
}
pub fn from_slice(fd: RawFd, buf: &[u8], offset: u64) -> Self {
Self {
fd,
buf: buf.as_ptr(),
len: buf.len() as u32,
offset,
}
}
}
impl PrepareOp for Write {
fn prepare(&self, sqe: &mut sys::io_uring_sqe) {
unsafe {
sys::io_uring_prep_write(
sqe,
self.fd,
self.buf as *const std::ffi::c_void,
self.len,
self.offset,
);
}
}
}
pub struct Fsync {
pub fd: RawFd,
pub flags: u32,
}
impl Fsync {
pub fn new(fd: RawFd) -> Self {
Self { fd, flags: 0 }
}
pub fn data_sync(fd: RawFd) -> Self {
Self {
fd,
flags: sys::IORING_FSYNC_DATASYNC,
}
}
}
impl PrepareOp for Fsync {
fn prepare(&self, sqe: &mut sys::io_uring_sqe) {
unsafe {
sys::io_uring_prep_fsync(sqe, self.fd, self.flags);
}
}
}
pub struct Nop;
impl PrepareOp for Nop {
fn prepare(&self, sqe: &mut sys::io_uring_sqe) {
unsafe {
sys::io_uring_prep_nop(sqe);
}
}
}
pub struct Accept {
pub fd: RawFd,
pub addr: *mut libc::sockaddr,
pub addrlen: *mut libc::socklen_t,
pub flags: i32,
}
impl Accept {
pub unsafe fn new(
fd: RawFd,
addr: *mut libc::sockaddr,
addrlen: *mut libc::socklen_t,
flags: i32,
) -> Self {
Self {
fd,
addr,
addrlen,
flags,
}
}
}
impl PrepareOp for Accept {
fn prepare(&self, sqe: &mut sys::io_uring_sqe) {
unsafe {
sys::io_uring_prep_accept(sqe, self.fd, self.addr, self.addrlen, self.flags);
}
}
}
pub struct Connect {
pub fd: RawFd,
pub addr: *const libc::sockaddr,
pub addrlen: libc::socklen_t,
}
impl Connect {
pub unsafe fn new(fd: RawFd, addr: *const libc::sockaddr, addrlen: libc::socklen_t) -> Self {
Self { fd, addr, addrlen }
}
}
impl PrepareOp for Connect {
fn prepare(&self, sqe: &mut sys::io_uring_sqe) {
unsafe {
sys::io_uring_prep_connect(sqe, self.fd, self.addr, self.addrlen);
}
}
}
pub struct Close {
pub fd: RawFd,
}
impl Close {
pub fn new(fd: RawFd) -> Self {
Self { fd }
}
}
impl PrepareOp for Close {
fn prepare(&self, sqe: &mut sys::io_uring_sqe) {
unsafe {
sys::io_uring_prep_close(sqe, self.fd);
}
}
}
pub trait SqeExt {
fn set_user_data(&mut self, data: u64);
fn set_flags(&mut self, flags: u8);
}
impl SqeExt for sys::io_uring_sqe {
fn set_user_data(&mut self, data: u64) {
unsafe {
sys::io_uring_sqe_set_data64(self, data);
}
}
fn set_flags(&mut self, flags: u8) {
unsafe {
sys::io_uring_sqe_set_flags(self, flags as u32);
}
}
}