Skip to content

Commit 8ca6d82

Browse files
committed
mqueue: change types to allow more cases
1 parent 7fa7206 commit 8ca6d82

File tree

2 files changed

+15
-15
lines changed

2 files changed

+15
-15
lines changed

src/mqueue.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
55
use {Errno, Result};
66

7-
use libc::{c_int, c_long, c_char, size_t, mode_t, strlen};
7+
use libc::{c_int, c_long, c_char, size_t, mode_t};
88
use std::ffi::CString;
99
use sys::stat::Mode;
10+
use std::ptr;
1011

1112
pub use self::consts::*;
1213

@@ -75,9 +76,9 @@ impl MqAttr {
7576
}
7677

7778

78-
#[inline]
79-
pub fn mq_open(name: &CString, oflag: MQ_OFlag, mode: Mode, attr: &MqAttr) -> Result<MQd> {
80-
let res = unsafe { ffi::mq_open(name.as_ptr(), oflag.bits(), mode.bits() as mode_t, attr as *const MqAttr) };
79+
pub fn mq_open(name: &CString, oflag: MQ_OFlag, mode: Mode, attr: Option<&MqAttr>) -> Result<MQd> {
80+
let attr_p = attr.map(|attr| attr as *const MqAttr).unwrap_or(ptr::null());
81+
let res = unsafe { ffi::mq_open(name.as_ptr(), oflag.bits(), mode.bits() as mode_t, attr_p) };
8182

8283
Errno::result(res)
8384
}
@@ -100,11 +101,10 @@ pub fn mq_receive(mqdes: MQd, message: &mut [u8], msq_prio: u32) -> Result<usize
100101
Errno::result(res).map(|r| r as usize)
101102
}
102103

103-
pub fn mq_send(mqdes: MQd, message: &CString, msq_prio: u32) -> Result<usize> {
104-
let len = unsafe { strlen(message.as_ptr()) as size_t };
105-
let res = unsafe { ffi::mq_send(mqdes, message.as_ptr(), len, msq_prio) };
104+
pub fn mq_send(mqdes: MQd, message: &[u8], msq_prio: u32) -> Result<()> {
105+
let res = unsafe { ffi::mq_send(mqdes, message.as_ptr() as *const c_char, message.len(), msq_prio) };
106106

107-
Errno::result(res).map(|r| r as usize)
107+
Errno::result(res).map(drop)
108108
}
109109

110110
pub fn mq_getattr(mqd: MQd) -> Result<MqAttr> {

test/test_mq.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ fn test_mq_send_and_receive() {
2020
const MSG_SIZE: c_long = 32;
2121
let attr = MqAttr::new(0, 10, MSG_SIZE, 0);
2222
let mq_name_in_parent = &CString::new(b"/a_nix_test_queue".as_ref()).unwrap();
23-
let mqd_in_parent = mq_open(mq_name_in_parent, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, &attr).unwrap();
24-
let msg_to_send = &CString::new("msg_1").unwrap();
23+
let mqd_in_parent = mq_open(mq_name_in_parent, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, Some(&attr)).unwrap();
24+
let msg_to_send = "msg_1".as_bytes();
2525

2626
mq_send(mqd_in_parent, msg_to_send, 1).unwrap();
2727

@@ -31,7 +31,7 @@ fn test_mq_send_and_receive() {
3131
match pid {
3232
Ok(Child) => {
3333
let mq_name_in_child = &CString::new(b"/a_nix_test_queue".as_ref()).unwrap();
34-
let mqd_in_child = mq_open(mq_name_in_child, O_CREAT | O_RDONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, &attr).unwrap();
34+
let mqd_in_child = mq_open(mq_name_in_child, O_CREAT | O_RDONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, Some(&attr)).unwrap();
3535
let mut buf = [0u8; 32];
3636
mq_receive(mqd_in_child, &mut buf, 1).unwrap();
3737
write(writer, &buf).unwrap(); // pipe result to parent process. Otherwise cargo does not report test failures correctly
@@ -59,7 +59,7 @@ fn test_mq_getattr() {
5959
const MSG_SIZE: c_long = 32;
6060
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
6161
let mq_name = &CString::new("/attr_test_get_attr".as_bytes().as_ref()).unwrap();
62-
let mqd = mq_open(mq_name, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, &initial_attr).unwrap();
62+
let mqd = mq_open(mq_name, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, Some(&initial_attr)).unwrap();
6363
let read_attr = mq_getattr(mqd);
6464
assert!(read_attr.unwrap() == initial_attr);
6565
mq_close(mqd).unwrap();
@@ -70,7 +70,7 @@ fn test_mq_setattr() {
7070
const MSG_SIZE: c_long = 32;
7171
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
7272
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();
73+
let mqd = mq_open(mq_name, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, Some(&initial_attr)).unwrap();
7474

7575
let new_attr = MqAttr::new(0, 20, MSG_SIZE * 2, 100);
7676
let old_attr = mq_setattr(mqd, &new_attr);
@@ -96,7 +96,7 @@ fn test_mq_set_nonblocking() {
9696
const MSG_SIZE: c_long = 32;
9797
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
9898
let mq_name = &CString::new("/attr_test_get_attr".as_bytes().as_ref()).unwrap();
99-
let mqd = mq_open(mq_name, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, &initial_attr).unwrap();
99+
let mqd = mq_open(mq_name, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, Some(&initial_attr)).unwrap();
100100
mq_set_nonblock(mqd).unwrap();
101101
let new_attr = mq_getattr(mqd);
102102
assert!(new_attr.unwrap().mq_flags == O_NONBLOCK.bits() as c_long);
@@ -112,7 +112,7 @@ fn test_mq_unlink() {
112112
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
113113
let mq_name_opened = &CString::new("/mq_unlink_test".as_bytes().as_ref()).unwrap();
114114
let mq_name_not_opened = &CString::new("/mq_unlink_test".as_bytes().as_ref()).unwrap();
115-
let mqd = mq_open(mq_name_opened, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, &initial_attr).unwrap();
115+
let mqd = mq_open(mq_name_opened, O_CREAT | O_WRONLY, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, Some(&initial_attr)).unwrap();
116116

117117
let res_unlink = mq_unlink(mq_name_opened);
118118
assert!(res_unlink == Ok(()) );

0 commit comments

Comments
 (0)