Skip to content

Commit 2478f0f

Browse files
committed
Merge #834
834: Expose mqueue functions for all supported OSes r=asomers a=asomers
2 parents a00bd10 + 739957f commit 2478f0f

File tree

6 files changed

+61
-15
lines changed

6 files changed

+61
-15
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
5656
([#813](https://github.com/nix-rust/nix/pull/813))
5757

5858
### Changed
59+
- Exposed the `mqueue` module for all supported operating systems.
60+
([#834](https://github.com/nix-rust/nix/pull/834))
5961
- Use native `pipe2` on all BSD targets. Users should notice no difference.
6062
([#777](https://github.com/nix-rust/nix/pull/777))
6163
- Renamed existing `ptrace` wrappers to encourage namespacing ([#692](https://github.com/nix-rust/nix/pull/692))

src/errno.rs

+4
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ impl ErrnoSentinel for i64 {
103103
fn sentinel() -> Self { -1 }
104104
}
105105

106+
impl ErrnoSentinel for *mut libc::c_void {
107+
fn sentinel() -> Self { (-1 as isize) as *mut libc::c_void }
108+
}
109+
106110
impl error::Error for Errno {
107111
fn description(&self) -> &str {
108112
self.desc()

src/lib.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,11 @@ pub mod fcntl;
3131
#[cfg(any(target_os = "linux", target_os = "android"))]
3232
pub mod mount;
3333

34-
#[cfg(target_os = "linux")]
34+
#[cfg(any(target_os = "dragonfly",
35+
target_os = "freebsd",
36+
target_os = "fushsia",
37+
target_os = "linux",
38+
target_os = "netbsd"))]
3539
pub mod mqueue;
3640

3741
pub mod pty;

src/mqueue.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Result;
66
use errno::Errno;
77

8-
use libc::{self, c_char, c_long, mode_t, mqd_t, size_t};
8+
use libc::{self, c_char, c_long, mqd_t, size_t};
99
use std::ffi::CString;
1010
use sys::stat::Mode;
1111
use std::mem;
@@ -76,7 +76,7 @@ pub fn mq_open(name: &CString,
7676
Some(mq_attr) => unsafe {
7777
libc::mq_open(name.as_ptr(),
7878
oflag.bits(),
79-
mode.bits() as mode_t,
79+
mode.bits() as libc::c_int,
8080
&mq_attr.mq_attr as *const libc::mq_attr)
8181
},
8282
None => unsafe { libc::mq_open(name.as_ptr(), oflag.bits()) },

test/test.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ extern crate tempfile;
1111

1212
mod sys;
1313
mod test_fcntl;
14-
#[cfg(target_os = "linux")]
14+
#[cfg(any(target_os = "dragonfly",
15+
target_os = "freebsd",
16+
target_os = "fushsia",
17+
target_os = "linux",
18+
target_os = "netbsd"))]
1519
mod test_mq;
1620
mod test_net;
1721
mod test_nix_path;

test/test_mq.rs

+43-11
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,19 @@ fn test_mq_send_and_receive() {
1515
let attr = MqAttr::new(0, 10, MSG_SIZE, 0);
1616
let mq_name= &CString::new(b"/a_nix_test_queue".as_ref()).unwrap();
1717

18-
let mqd0 = mq_open(mq_name, MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY,
19-
Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH,
20-
Some(&attr)).unwrap();
18+
let oflag0 = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
19+
let mode = Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH;
20+
let r0 = mq_open(mq_name, oflag0, mode, Some(&attr));
21+
if let Err(Sys(ENOSYS)) = r0 {
22+
println!("message queues not supported or module not loaded?");
23+
return;
24+
};
25+
let mqd0 = r0.unwrap();
2126
let msg_to_send = "msg_1";
2227
mq_send(mqd0, msg_to_send.as_bytes(), 1).unwrap();
2328

24-
let mqd1 = mq_open(mq_name, MQ_OFlag::O_CREAT | MQ_OFlag::O_RDONLY,
25-
Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH,
26-
Some(&attr)).unwrap();
29+
let oflag1 = MQ_OFlag::O_CREAT | MQ_OFlag::O_RDONLY;
30+
let mqd1 = mq_open(mq_name, oflag1, mode, Some(&attr)).unwrap();
2731
let mut buf = [0u8; 32];
2832
let mut prio = 0u32;
2933
let len = mq_receive(mqd1, &mut buf, &mut prio).unwrap();
@@ -40,7 +44,15 @@ fn test_mq_getattr() {
4044
const MSG_SIZE: c_long = 32;
4145
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
4246
let mq_name = &CString::new(b"/attr_test_get_attr".as_ref()).unwrap();
43-
let mqd = mq_open(mq_name, MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY, Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH, Some(&initial_attr)).unwrap();
47+
let oflag = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
48+
let mode = Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH;
49+
let r = mq_open(mq_name, oflag, mode, Some(&initial_attr));
50+
if let Err(Sys(ENOSYS)) = r {
51+
println!("message queues not supported or module not loaded?");
52+
return;
53+
};
54+
let mqd = r.unwrap();
55+
4456
let read_attr = mq_getattr(mqd);
4557
assert!(read_attr.unwrap() == initial_attr);
4658
mq_close(mqd).unwrap();
@@ -53,7 +65,14 @@ fn test_mq_setattr() {
5365
const MSG_SIZE: c_long = 32;
5466
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
5567
let mq_name = &CString::new(b"/attr_test_get_attr".as_ref()).unwrap();
56-
let mqd = mq_open(mq_name, MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY, Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH, Some(&initial_attr)).unwrap();
68+
let oflag = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
69+
let mode = Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH;
70+
let r = mq_open(mq_name, oflag, mode, Some(&initial_attr));
71+
if let Err(Sys(ENOSYS)) = r {
72+
println!("message queues not supported or module not loaded?");
73+
return;
74+
};
75+
let mqd = r.unwrap();
5776

5877
let new_attr = MqAttr::new(0, 20, MSG_SIZE * 2, 100);
5978
let old_attr = mq_setattr(mqd, &new_attr);
@@ -81,7 +100,14 @@ fn test_mq_set_nonblocking() {
81100
const MSG_SIZE: c_long = 32;
82101
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
83102
let mq_name = &CString::new(b"/attr_test_get_attr".as_ref()).unwrap();
84-
let mqd = mq_open(mq_name, MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY, Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH, Some(&initial_attr)).unwrap();
103+
let oflag = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
104+
let mode = Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH;
105+
let r = mq_open(mq_name, oflag, mode, Some(&initial_attr));
106+
if let Err(Sys(ENOSYS)) = r {
107+
println!("message queues not supported or module not loaded?");
108+
return;
109+
};
110+
let mqd = r.unwrap();
85111
mq_set_nonblock(mqd).unwrap();
86112
let new_attr = mq_getattr(mqd);
87113
assert!(new_attr.unwrap().flags() == MQ_OFlag::O_NONBLOCK.bits() as c_long);
@@ -97,7 +123,14 @@ fn test_mq_unlink() {
97123
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
98124
let mq_name_opened = &CString::new(b"/mq_unlink_test".as_ref()).unwrap();
99125
let mq_name_not_opened = &CString::new(b"/mq_unlink_test".as_ref()).unwrap();
100-
let mqd = mq_open(mq_name_opened, MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY, Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH, Some(&initial_attr)).unwrap();
126+
let oflag = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
127+
let mode = Mode::S_IWUSR | Mode::S_IRUSR | Mode::S_IRGRP | Mode::S_IROTH;
128+
let r = mq_open(mq_name_opened, oflag, mode, Some(&initial_attr));
129+
if let Err(Sys(ENOSYS)) = r {
130+
println!("message queues not supported or module not loaded?");
131+
return;
132+
};
133+
let mqd = r.unwrap();
101134

102135
let res_unlink = mq_unlink(mq_name_opened);
103136
assert!(res_unlink == Ok(()) );
@@ -108,5 +141,4 @@ fn test_mq_unlink() {
108141
mq_close(mqd).unwrap();
109142
let res_unlink_after_close = mq_unlink(mq_name_opened);
110143
assert!(res_unlink_after_close == Err(Sys(ENOENT)) );
111-
112144
}

0 commit comments

Comments
 (0)