use std::ffi::CStr;
use std::os::raw::c_char;
use crate::sys::{fi_cq_err_entry, fi_cq_strerror, fi_strerror, fid_cq};
use dma_libfabric_protocol::DmaError;
pub(crate) fn check(code: i32, what: &'static str) -> Result<(), DmaError> {
if 0 == code {
Ok(())
} else {
Err(fabric_error(code, what))
}
}
pub(crate) fn fabric_error(code: i32, what: &'static str) -> DmaError {
let message = unsafe { CStr::from_ptr(fi_strerror(-code)) }.to_string_lossy();
DmaError::Fabric(format!("{what}: {message} ({code})"))
}
pub(crate) fn completion_error(completion_queue: *mut fid_cq, entry: &fi_cq_err_entry) -> DmaError {
let fabric = unsafe { CStr::from_ptr(fi_strerror(entry.err)) }.to_string_lossy();
let mut buffer = [0 as c_char; 256];
let provider = unsafe {
let decoded = fi_cq_strerror(
completion_queue,
entry.prov_errno,
entry.err_data,
buffer.as_mut_ptr(),
buffer.len(),
);
CStr::from_ptr(decoded).to_string_lossy().into_owned()
};
DmaError::Transfer(format!(
"completion error: {fabric} (err={}); provider: {provider} (prov_errno={})",
entry.err, entry.prov_errno
))
}