From 9ac438b82fee5b2f55a66fa26b2ebd419445a368 Mon Sep 17 00:00:00 2001 From: Markus Jais Date: Sat, 18 Jul 2015 14:08:32 +0200 Subject: added mq_getattr for Linux --- src/mqueue.rs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'src/mqueue.rs') diff --git a/src/mqueue.rs b/src/mqueue.rs index 63078192..ee2e5f2d 100644 --- a/src/mqueue.rs +++ b/src/mqueue.rs @@ -33,30 +33,40 @@ mod consts { } mod ffi { - use libc::{c_char, size_t, ssize_t, c_uint, c_int, mode_t}; + use libc::{c_char, size_t, ssize_t, c_uint, c_int}; use super::MQd; use super::MqAttr; - extern { - pub fn mq_open(name: *const c_char, oflag: c_int, mode: mode_t, attr: *const MqAttr) -> MQd; + extern "C" { + pub fn mq_open(name: *const c_char, oflag: c_int, ...) -> MQd; - pub fn mq_close (mqdes: MQd) -> c_int; + pub fn mq_close (mqd: MQd) -> c_int; - pub fn mq_receive (mqdes: MQd, msg_ptr: *const c_char, msg_len: size_t, msq_prio: *const c_uint) -> ssize_t; + pub fn mq_receive (mqd: MQd, msg_ptr: *const c_char, msg_len: size_t, msq_prio: *const c_uint) -> ssize_t; - pub fn mq_send (mqdes: MQd, msg_ptr: *const c_char, msg_len: size_t, msq_prio: c_uint) -> c_int; + pub fn mq_send (mqd: MQd, msg_ptr: *const c_char, msg_len: size_t, msq_prio: c_uint) -> c_int; + + pub fn mq_getattr(mqd: MQd, attr: *mut MqAttr) -> c_int; } } #[repr(C)] -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct MqAttr { pub mq_flags: c_long, pub mq_maxmsg: c_long, pub mq_msgsize: c_long, pub mq_curmsgs: c_long, + pad: [c_long; 4] +} + +impl MqAttr { + pub fn new(mq_flags: c_long, mq_maxmsg: c_long, mq_msgsize: c_long, mq_curmsgs: c_long) -> MqAttr { + MqAttr { mq_flags: mq_flags, mq_maxmsg: mq_maxmsg, mq_msgsize: mq_msgsize, mq_curmsgs: mq_curmsgs, pad: [0; 4] } + } } + #[inline] pub fn mq_open(name: &CString, oflag: MQ_OFlag, mode: Mode, attr: &MqAttr) -> Result { let res = unsafe { ffi::mq_open(name.as_ptr(), oflag.bits(), mode.bits() as mode_t, attr as *const MqAttr) }; @@ -95,3 +105,12 @@ pub fn mq_send(mqdes: MQd, message: &CString, msq_prio: u32) -> Result { Ok(res as usize) } + +pub fn mq_getattr(mqd: MQd) -> Result { + let mut attr = MqAttr::new(0, 0, 0, 0); + let res = unsafe { ffi::mq_getattr(mqd, &mut attr) }; + if res < 0 { + return Err(Error::Sys(Errno::last())); + } + Ok(attr) +} -- cgit v1.2.3