Skip to content

Commit 2abfdb4

Browse files
Port mqueue to x32
Test fix obtained from #1384 (comment)
1 parent de43d76 commit 2abfdb4

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

src/mqueue.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use crate::Result;
66
use crate::errno::Errno;
77

8-
use libc::{self, c_char, c_long, mqd_t, size_t};
8+
use libc::{self, c_char, mqd_t, size_t};
99
use std::ffi::CString;
1010
use crate::sys::stat::Mode;
1111
use std::mem;
@@ -34,11 +34,18 @@ pub struct MqAttr {
3434
mq_attr: libc::mq_attr,
3535
}
3636

37+
// x32 compatibility
38+
// See https://sourceware.org/bugzilla/show_bug.cgi?id=21279
39+
#[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))]
40+
pub type mq_attr_member_t = i64;
41+
#[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))]
42+
pub type mq_attr_member_t = libc::c_long;
43+
3744
impl MqAttr {
38-
pub fn new(mq_flags: c_long,
39-
mq_maxmsg: c_long,
40-
mq_msgsize: c_long,
41-
mq_curmsgs: c_long)
45+
pub fn new(mq_flags: mq_attr_member_t,
46+
mq_maxmsg: mq_attr_member_t,
47+
mq_msgsize: mq_attr_member_t,
48+
mq_curmsgs: mq_attr_member_t)
4249
-> MqAttr
4350
{
4451
let mut attr = mem::MaybeUninit::<libc::mq_attr>::uninit();
@@ -52,7 +59,7 @@ impl MqAttr {
5259
}
5360
}
5461

55-
pub fn flags(&self) -> c_long {
62+
pub fn flags(&self) -> mq_attr_member_t {
5663
self.mq_attr.mq_flags
5764
}
5865
}
@@ -150,7 +157,7 @@ pub fn mq_setattr(mqd: mqd_t, newattr: &MqAttr) -> Result<MqAttr> {
150157
/// Returns the old attributes
151158
pub fn mq_set_nonblock(mqd: mqd_t) -> Result<MqAttr> {
152159
let oldattr = mq_getattr(mqd)?;
153-
let newattr = MqAttr::new(c_long::from(MQ_OFlag::O_NONBLOCK.bits()),
160+
let newattr = MqAttr::new(mq_attr_member_t::from(MQ_OFlag::O_NONBLOCK.bits()),
154161
oldattr.mq_attr.mq_maxmsg,
155162
oldattr.mq_attr.mq_msgsize,
156163
oldattr.mq_attr.mq_curmsgs);

test/test_mq.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
use libc::c_long;
2-
31
use std::ffi::CString;
42
use std::str;
53

64
use nix::errno::Errno::*;
75
use nix::Error::Sys;
8-
use nix::mqueue::{mq_open, mq_close, mq_send, mq_receive};
6+
use nix::mqueue::{mq_open, mq_close, mq_send, mq_receive, mq_attr_member_t};
97
use nix::mqueue::{MqAttr, MQ_OFlag};
108
use nix::sys::stat::Mode;
119

1210
#[test]
1311
fn test_mq_send_and_receive() {
14-
const MSG_SIZE: c_long = 32;
12+
const MSG_SIZE: mq_attr_member_t = 32;
1513
let attr = MqAttr::new(0, 10, MSG_SIZE, 0);
1614
let mq_name= &CString::new(b"/a_nix_test_queue".as_ref()).unwrap();
1715

@@ -43,7 +41,7 @@ fn test_mq_send_and_receive() {
4341
#[cfg(not(any(target_os = "netbsd")))]
4442
fn test_mq_getattr() {
4543
use nix::mqueue::mq_getattr;
46-
const MSG_SIZE: c_long = 32;
44+
const MSG_SIZE: mq_attr_member_t = 32;
4745
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
4846
let mq_name = &CString::new(b"/attr_test_get_attr".as_ref()).unwrap();
4947
let oflag = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
@@ -66,7 +64,7 @@ fn test_mq_getattr() {
6664
#[cfg_attr(any(target_arch = "mips", target_arch = "mips64"), ignore)]
6765
fn test_mq_setattr() {
6866
use nix::mqueue::{mq_getattr, mq_setattr};
69-
const MSG_SIZE: c_long = 32;
67+
const MSG_SIZE: mq_attr_member_t = 32;
7068
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
7169
let mq_name = &CString::new(b"/attr_test_get_attr".as_ref()).unwrap();
7270
let oflag = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
@@ -87,7 +85,7 @@ fn test_mq_setattr() {
8785
// O_NONBLOCK can be set (see tests below)
8886
assert_ne!(new_attr_get, new_attr);
8987

90-
let new_attr_non_blocking = MqAttr::new(MQ_OFlag::O_NONBLOCK.bits() as c_long, 10, MSG_SIZE, 0);
88+
let new_attr_non_blocking = MqAttr::new(MQ_OFlag::O_NONBLOCK.bits() as mq_attr_member_t, 10, MSG_SIZE, 0);
9189
mq_setattr(mqd, &new_attr_non_blocking).unwrap();
9290
let new_attr_get = mq_getattr(mqd).unwrap();
9391

@@ -103,7 +101,7 @@ fn test_mq_setattr() {
103101
#[cfg_attr(any(target_arch = "mips", target_arch = "mips64"), ignore)]
104102
fn test_mq_set_nonblocking() {
105103
use nix::mqueue::{mq_getattr, mq_set_nonblock, mq_remove_nonblock};
106-
const MSG_SIZE: c_long = 32;
104+
const MSG_SIZE: mq_attr_member_t = 32;
107105
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
108106
let mq_name = &CString::new(b"/attr_test_get_attr".as_ref()).unwrap();
109107
let oflag = MQ_OFlag::O_CREAT | MQ_OFlag::O_WRONLY;
@@ -116,7 +114,7 @@ fn test_mq_set_nonblocking() {
116114
let mqd = r.unwrap();
117115
mq_set_nonblock(mqd).unwrap();
118116
let new_attr = mq_getattr(mqd);
119-
assert_eq!(new_attr.unwrap().flags(), MQ_OFlag::O_NONBLOCK.bits() as c_long);
117+
assert_eq!(new_attr.unwrap().flags(), MQ_OFlag::O_NONBLOCK.bits() as mq_attr_member_t);
120118
mq_remove_nonblock(mqd).unwrap();
121119
let new_attr = mq_getattr(mqd);
122120
assert_eq!(new_attr.unwrap().flags(), 0);
@@ -127,7 +125,7 @@ fn test_mq_set_nonblocking() {
127125
#[cfg(not(any(target_os = "netbsd")))]
128126
fn test_mq_unlink() {
129127
use nix::mqueue::mq_unlink;
130-
const MSG_SIZE: c_long = 32;
128+
const MSG_SIZE: mq_attr_member_t = 32;
131129
let initial_attr = MqAttr::new(0, 10, MSG_SIZE, 0);
132130
let mq_name_opened = &CString::new(b"/mq_unlink_test".as_ref()).unwrap();
133131
let mq_name_not_opened = &CString::new(b"/mq_unlink_test".as_ref()).unwrap();

0 commit comments

Comments
 (0)