/// Open a POSIX message queue.
///
/// # Examples
///
/// ```
/// let name = "nc-posix-mq";
/// let ret = unsafe {
/// nc::mq_open(
/// name,
/// nc::O_CREAT | nc::O_RDWR,
/// (nc::S_IRUSR | nc::S_IWUSR) as nc::umode_t,
/// None,
/// )
/// };
/// assert!(ret.is_ok());
/// let mq_id = ret.unwrap();
/// let ret = unsafe { nc::close(mq_id) };
/// assert!(ret.is_ok());
/// let ret = unsafe { nc::mq_unlink(name) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn mq_open<P: AsRef<Path>>(
name: P,
oflag: i32,
mode: umode_t,
attr: Option<&mut mq_attr_t>,
) -> Result<mqd_t, Errno> {
let name = CString::new(name.as_ref());
let name_ptr = name.as_ptr() as usize;
let oflag = oflag as usize;
let mode = mode as usize;
let attr_ptr = attr.map_or(core::ptr::null_mut::<mq_attr_t>() as usize, |attr| {
attr as *mut mq_attr_t as usize
});
syscall4(SYS_MQ_OPEN, name_ptr, oflag, mode, attr_ptr).map(|ret| ret as mqd_t)
}