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
7#[cfg(test)]
8mod test {
9    use std::{
10        mem::{self, MaybeUninit},
11        os::fd::AsRawFd,
12        ptr,
13    };
14
15    use super::*;
16
17    #[test]
18    fn cq_size() {
19        unsafe {
20            assert!(unsafe_cq_size(4) == 0);
21            assert!(unsafe_cq_size(0) == -libc::EINVAL);
22        }
23    }
24
25    unsafe fn unsafe_cq_size(cq_size: u32) -> i32 {
26        let mut params: io_uring_params = mem::zeroed();
27        params.flags = IORING_SETUP_CQSIZE;
28        params.cq_entries = cq_size;
29        let mut ring = MaybeUninit::uninit();
30        let ret = io_uring_queue_init_params(4, ring.as_mut_ptr(), &mut params);
31        let mut ring = ring.assume_init();
32        if cq_size > 0 {
33            assert!(params.cq_entries >= cq_size);
34        }
35        io_uring_queue_exit(&mut ring);
36        ret
37    }
38
39    #[test]
40    fn fsync() {
41        unsafe {
42            let mut ring = MaybeUninit::uninit();
43            let ret = io_uring_queue_init(8, ring.as_mut_ptr(), 0);
44            assert!(ret == 0);
45            let mut ring = ring.assume_init();
46
47            let f = tempfile::NamedTempFile::new().unwrap();
48            let fd = f.as_file().as_raw_fd();
49
50            let sqe = io_uring_get_sqe(&mut ring);
51            assert!(!sqe.is_null());
52            io_uring_prep_fsync(sqe, fd, 0);
53            let ret = io_uring_submit(&mut ring);
54            assert!(ret > 0);
55
56            let mut cqe = ptr::null_mut();
57            let ret = io_uring_wait_cqe(&mut ring, &mut cqe);
58            assert!(ret >= 0);
59            io_uring_cqe_seen(&mut ring, cqe);
60        }
61    }
62}