@@ -3,9 +3,13 @@ use std::ffi::CString;
33use std:: str;
44
55use 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+ } ;
79use nix:: mqueue:: { MQ_OFlag , MqAttr } ;
810use nix:: sys:: stat:: Mode ;
11+ use nix:: sys:: time:: { TimeSpec , TimeValLike } ;
12+ use nix:: time:: { clock_gettime, ClockId } ;
913
1014// Defined as a macro such that the error source is reported as the caller's location.
1115macro_rules! assert_attr_eq {
@@ -55,6 +59,37 @@ fn test_mq_send_and_receive() {
5559 assert_eq ! ( msg_to_send, str :: from_utf8( & buf[ 0 ..len] ) . unwrap( ) ) ;
5660}
5761
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+
5893#[ test]
5994fn test_mq_getattr ( ) {
6095 use nix:: mqueue:: mq_getattr;
0 commit comments