uring-sys2 0.12.0

liburing bindings
Documentation
use std::alloc;
use uring_sys2::*;

use crate::common::{io_uring_init, strerror};

mod common;

enum TestResult {
    Ok,
    NotSupported,
}

#[test]
fn test_buf_ring() {
    let bgids = [1, 127, -1];

    for bgid in bgids {
        match unsafe { test_reg_unreg(bgid) } {
            TestResult::Ok => (),
            TestResult::NotSupported => {
                eprintln!("buffer ring not supported, skipping");
                return;
            }
        }
    }
}

unsafe fn test_reg_unreg(bgid: i32) -> TestResult {
    let mut ring = io_uring_init(1).unwrap();

    let ptr = alloc::alloc(alloc::Layout::from_size_align_unchecked(4096, 4096));
    assert!(!ptr.is_null());

    let mut reg = io_uring_buf_reg {
        ring_addr: ptr as usize as u64,
        ring_entries: 32,
        bgid: bgid as u16,
        flags: 0,
        resv: [0; 3],
    };
    let ret = io_uring_register_buf_ring(&mut ring, &mut reg, 0);
    if ret != 0 {
        if ret == -libc::EINVAL {
            return TestResult::NotSupported;
        }
        panic!("buffer ring register failed: {}", strerror(-ret));
    }

    let ret = io_uring_unregister_buf_ring(&mut ring, bgid);
    if ret != 0 {
        panic!("buffer ring register failed: {}", -ret);
    }

    io_uring_queue_exit(&mut ring);

    return TestResult::Ok;
}