|
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 | + |
3 | 5 | use nix::mqueue::MqAttr;
|
4 | 6 | use nix::sys::stat::{S_IWUSR, S_IRUSR, S_IRGRP, S_IROTH};
|
5 | 7 | use std::ffi::CString;
|
@@ -63,6 +65,34 @@ fn test_mq_get_attr() {
|
63 | 65 | mq_close(mqd).unwrap();
|
64 | 66 | }
|
65 | 67 |
|
| 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 | + |
66 | 96 | #[test]
|
67 | 97 | fn test_mq_unlink() {
|
68 | 98 | const MSG_SIZE: c_long = 32;
|
|
0 commit comments