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}