@@ -3,9 +3,13 @@ use std::ffi::CString;
3
3
use std:: str;
4
4
5
5
use nix:: errno:: Errno ;
6
- use nix:: mqueue:: { mq_attr_member_t, mq_close, mq_open, mq_receive, mq_send} ;
6
+ use nix:: mqueue:: {
7
+ mq_attr_member_t, mq_close, mq_open, mq_receive, mq_send, mq_timedreceive,
8
+ } ;
7
9
use nix:: mqueue:: { MQ_OFlag , MqAttr } ;
8
10
use nix:: sys:: stat:: Mode ;
11
+ use nix:: sys:: time:: { TimeSpec , TimeValLike } ;
12
+ use nix:: time:: { clock_gettime, ClockId } ;
9
13
10
14
// Defined as a macro such that the error source is reported as the caller's location.
11
15
macro_rules! assert_attr_eq {
@@ -55,6 +59,37 @@ fn test_mq_send_and_receive() {
55
59
assert_eq ! ( msg_to_send, str :: from_utf8( & buf[ 0 ..len] ) . unwrap( ) ) ;
56
60
}
57
61
62
+ #[ test]
63
+ fn test_mq_timedreceive ( ) {
64
+ const MSG_SIZE : mq_attr_member_t = 32 ;
65
+ let attr = MqAttr :: new ( 0 , 10 , MSG_SIZE , 0 ) ;
66
+ let mq_name = & CString :: new ( b"/a_nix_test_queue" . as_ref ( ) ) . unwrap ( ) ;
67
+
68
+ let oflag0 = 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 r0 = mq_open ( mq_name, oflag0, mode, Some ( & attr) ) ;
71
+ if let Err ( Errno :: ENOSYS ) = r0 {
72
+ println ! ( "message queues not supported or module not loaded?" ) ;
73
+ return ;
74
+ } ;
75
+ let mqd0 = r0. unwrap ( ) ;
76
+ let msg_to_send = "msg_1" ;
77
+ mq_send ( & mqd0, msg_to_send. as_bytes ( ) , 1 ) . unwrap ( ) ;
78
+
79
+ let oflag1 = MQ_OFlag :: O_CREAT | MQ_OFlag :: O_RDONLY ;
80
+ let mqd1 = mq_open ( mq_name, oflag1, mode, Some ( & attr) ) . unwrap ( ) ;
81
+ let mut buf = [ 0u8 ; 32 ] ;
82
+ let mut prio = 0u32 ;
83
+ let abstime =
84
+ clock_gettime ( ClockId :: CLOCK_REALTIME ) . unwrap ( ) + TimeSpec :: seconds ( 1 ) ;
85
+ let len = mq_timedreceive ( & mqd1, & mut buf, & mut prio, & abstime) . unwrap ( ) ;
86
+ assert_eq ! ( prio, 1 ) ;
87
+
88
+ mq_close ( mqd1) . unwrap ( ) ;
89
+ mq_close ( mqd0) . unwrap ( ) ;
90
+ assert_eq ! ( msg_to_send, str :: from_utf8( & buf[ 0 ..len] ) . unwrap( ) ) ;
91
+ }
92
+
58
93
#[ test]
59
94
fn test_mq_getattr ( ) {
60
95
use nix:: mqueue:: mq_getattr;
0 commit comments