c-ares 13.0.0

A Rust wrapper for the c-ares library, for asynchronous DNS requests.
Documentation
use core::ffi::{c_int, c_uchar, c_void};
use std::slice;

use crate::error::{Error, Result};
use crate::panic;
use crate::record::QueryRecord;

pub(crate) unsafe extern "C" fn raw_query_callback<F>(
    arg: *mut c_void,
    status: c_int,
    _timeouts: c_int,
    abuf: *const c_uchar,
    alen: c_int,
) where
    F: FnOnce(Result<&[u8]>) + Send + 'static,
{
    let result = if status == c_ares_sys::ares_status_t::ARES_SUCCESS as i32 {
        let data = unsafe { slice::from_raw_parts(abuf, alen as usize) };
        Ok(data)
    } else {
        Err(Error::from(status))
    };
    let handler = unsafe { Box::from_raw(arg.cast::<F>()) };
    panic::abort_on_panic(|| handler(result));
}

pub(crate) unsafe extern "C" fn query_callback<R, F>(
    arg: *mut c_void,
    status: c_int,
    _timeouts: c_int,
    abuf: *const c_uchar,
    alen: c_int,
) where
    R: QueryRecord,
    F: FnOnce(Result<R>) + Send + 'static,
{
    ares_callback!(arg.cast::<F>(), status, abuf, alen, R::parse);
}