uring_sys2/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
6
7pub const IOSQE_FIXED_FILE: u32 = 1 << IOSQE_FIXED_FILE_BIT;
8pub const IOSQE_IO_DRAIN: u32 = 1 << IOSQE_IO_DRAIN_BIT;
9pub const IOSQE_IO_LINK: u32 = 1 << IOSQE_IO_LINK_BIT;
10pub const IOSQE_IO_HARDLINK: u32 = 1 << IOSQE_IO_HARDLINK_BIT;
11pub const IOSQE_ASYNC: u32 = 1 << IOSQE_ASYNC_BIT;
12pub const IOSQE_BUFFER_SELECT: u32 = 1 << IOSQE_BUFFER_SELECT_BIT;
13pub const IOSQE_CQE_SKIP_SUCCESS: u32 = 1 << IOSQE_CQE_SKIP_SUCCESS_BIT;
14
15#[cfg(test)]
16mod test {
17    use std::{
18        mem::{self, MaybeUninit},
19        os::fd::AsRawFd,
20        ptr,
21    };
22
23    use super::*;
24
25    #[test]
26    fn cq_size() {
27        unsafe {
28            assert!(unsafe_cq_size(4) == 0);
29            assert!(unsafe_cq_size(0) == -libc::EINVAL);
30        }
31    }
32
33    unsafe fn unsafe_cq_size(cq_size: u32) -> i32 {
34        let mut params: io_uring_params = mem::zeroed();
35        params.flags = IORING_SETUP_CQSIZE;
36        params.cq_entries = cq_size;
37        let mut ring = MaybeUninit::uninit();
38        let ret = io_uring_queue_init_params(4, ring.as_mut_ptr(), &mut params);
39        let mut ring = ring.assume_init();
40        if cq_size > 0 {
41            assert!(params.cq_entries >= cq_size);
42        }
43        io_uring_queue_exit(&mut ring);
44        ret
45    }
46
47    #[test]
48    fn fsync() {
49        unsafe {
50            let mut ring = MaybeUninit::uninit();
51            let ret = io_uring_queue_init(8, ring.as_mut_ptr(), 0);
52            assert!(ret == 0);
53            let mut ring = ring.assume_init();
54
55            let f = tempfile::NamedTempFile::new().unwrap();
56            let fd = f.as_file().as_raw_fd();
57
58            let sqe = io_uring_get_sqe(&mut ring);
59            assert!(!sqe.is_null());
60            io_uring_prep_fsync(sqe, fd, 0);
61            let ret = io_uring_submit(&mut ring);
62            assert!(ret > 0);
63
64            let mut cqe = ptr::null_mut();
65            let ret = io_uring_wait_cqe(&mut ring, &mut cqe);
66            assert!(ret >= 0);
67            io_uring_cqe_seen(&mut ring, cqe);
68        }
69    }
70}