summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mqueue.rs12
-rw-r--r--test/test_mq.rs34
2 files changed, 44 insertions, 2 deletions
diff --git a/src/mqueue.rs b/src/mqueue.rs
index d225465b..460c7e89 100644
--- a/src/mqueue.rs
+++ b/src/mqueue.rs
@@ -49,6 +49,8 @@ mod ffi {
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;
+
+ pub fn mq_setattr(mqd: MQd, newattr: *const MqAttr, oldattr: *mut MqAttr) -> c_int;
}
}
@@ -121,3 +123,13 @@ pub fn mq_getattr(mqd: MQd) -> Result<MqAttr> {
}
Ok(attr)
}
+
+
+pub fn mq_setattr(mqd: MQd, newattr: &MqAttr) -> Result<MqAttr> {
+ let mut attr = MqAttr::new(0, 0, 0, 0);
+ let res = unsafe { ffi::mq_setattr(mqd, newattr as *const MqAttr, &mut attr) };
+ if res < 0 {
+ return Err(Error::Sys(Errno::last()));
+ }
+ Ok(attr)
+}
diff --git a/test/test_mq.rs b/test/test_mq.rs
index ecd6e5b9..cc661d38 100644
--- a/test/test_mq.rs
+++ b/test/test_mq.rs
@@ -1,5 +1,7 @@
-use nix::mqueue::{mq_open, mq_close, mq_send, mq_receive, mq_getattr, mq_unlink};
-use nix::mqueue::{O_CREAT, O_WRONLY, O_RDONLY};
+use nix::mqueue::{mq_open, mq_close, mq_send, mq_receive, mq_getattr, mq_setattr, mq_unlink};
+use nix::mqueue::{O_CREAT, O_WRONLY, O_RDONLY, O_NONBLOCK};
+
+
use nix::mqueue::MqAttr;
use nix::sys::stat::{S_IWUSR, S_IRUSR, S_IRGRP, S_IROTH};
use std::ffi::CString;
@@ -64,6 +66,34 @@ fn test_mq_get_attr() {
}
#[test]
+fn test_mq_set_attr() {
+ const MSG_SIZE: c_long = 32;
+ let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
+ let mq_name = &CString::new("/attr_test_get_attr".as_bytes().as_ref()).unwrap();
+ let mqd = mq_open(mq_name, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, &initial_attr).unwrap();
+
+ let new_attr = MqAttr::new(0, 20, MSG_SIZE * 2, 100);
+ let old_attr = mq_setattr(mqd, &new_attr);
+ assert!(old_attr.unwrap() == initial_attr);
+
+ let new_attr_get = mq_getattr(mqd);
+ // The following tests make sense. No changes here because according to the Linux man page only
+ // O_NONBLOCK can be set (see tests below)
+ assert!(new_attr_get.unwrap() != new_attr);
+
+ let new_attr_non_blocking = MqAttr::new(O_NONBLOCK.bits() as c_long, 10, MSG_SIZE, 0);
+ mq_setattr(mqd, &new_attr_non_blocking).unwrap();
+ let new_attr_get = mq_getattr(mqd);
+
+ // now the O_NONBLOCK flag has been set
+ assert!(new_attr_get.unwrap() != initial_attr);
+ assert!(new_attr_get.unwrap() == new_attr_non_blocking);
+ mq_close(mqd).unwrap();
+}
+
+
+
+#[test]
fn test_mq_unlink() {
const MSG_SIZE: c_long = 32;
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);