Skip to content

Commit fad667e

Browse files
Markus Jaiscarllerche
authored andcommitted
added support and tests for mq_setattr
1 parent 1f4b0b7 commit fad667e

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

src/mqueue.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ mod ffi {
4949
pub fn mq_send (mqd: MQd, msg_ptr: *const c_char, msg_len: size_t, msq_prio: c_uint) -> c_int;
5050

5151
pub fn mq_getattr(mqd: MQd, attr: *mut MqAttr) -> c_int;
52+
53+
pub fn mq_setattr(mqd: MQd, newattr: *const MqAttr, oldattr: *mut MqAttr) -> c_int;
5254
}
5355
}
5456

@@ -121,3 +123,13 @@ pub fn mq_getattr(mqd: MQd) -> Result<MqAttr> {
121123
}
122124
Ok(attr)
123125
}
126+
127+
128+
pub fn mq_setattr(mqd: MQd, newattr: &MqAttr) -> Result<MqAttr> {
129+
let mut attr = MqAttr::new(0, 0, 0, 0);
130+
let res = unsafe { ffi::mq_setattr(mqd, newattr as *const MqAttr, &mut attr) };
131+
if res < 0 {
132+
return Err(Error::Sys(Errno::last()));
133+
}
134+
Ok(attr)
135+
}

test/test_mq.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
use nix::mqueue::{mq_open, mq_close, mq_send, mq_receive, mq_getattr, mq_unlink};
2-
use nix::mqueue::{O_CREAT, O_WRONLY, O_RDONLY};
1+
use nix::mqueue::{mq_open, mq_close, mq_send, mq_receive, mq_getattr, mq_setattr, mq_unlink};
2+
use nix::mqueue::{O_CREAT, O_WRONLY, O_RDONLY, O_NONBLOCK};
3+
4+
35
use nix::mqueue::MqAttr;
46
use nix::sys::stat::{S_IWUSR, S_IRUSR, S_IRGRP, S_IROTH};
57
use std::ffi::CString;
@@ -63,6 +65,34 @@ fn test_mq_get_attr() {
6365
mq_close(mqd).unwrap();
6466
}
6567

68+
#[test]
69+
fn test_mq_set_attr() {
70+
const MSG_SIZE: c_long = 32;
71+
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
72+
let mq_name = &CString::new("/attr_test_get_attr".as_bytes().as_ref()).unwrap();
73+
let mqd = mq_open(mq_name, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, &initial_attr).unwrap();
74+
75+
let new_attr = MqAttr::new(0, 20, MSG_SIZE * 2, 100);
76+
let old_attr = mq_setattr(mqd, &new_attr);
77+
assert!(old_attr.unwrap() == initial_attr);
78+
79+
let new_attr_get = mq_getattr(mqd);
80+
// The following tests make sense. No changes here because according to the Linux man page only
81+
// O_NONBLOCK can be set (see tests below)
82+
assert!(new_attr_get.unwrap() != new_attr);
83+
84+
let new_attr_non_blocking = MqAttr::new(O_NONBLOCK.bits() as c_long, 10, MSG_SIZE, 0);
85+
mq_setattr(mqd, &new_attr_non_blocking).unwrap();
86+
let new_attr_get = mq_getattr(mqd);
87+
88+
// now the O_NONBLOCK flag has been set
89+
assert!(new_attr_get.unwrap() != initial_attr);
90+
assert!(new_attr_get.unwrap() == new_attr_non_blocking);
91+
mq_close(mqd).unwrap();
92+
}
93+
94+
95+
6696
#[test]
6797
fn test_mq_unlink() {
6898
const MSG_SIZE: c_long = 32;

0 commit comments

Comments
 (0)