xref: /rust-libc-0.2.174/libc-test/test/cmsg.rs (revision 682eba61)
1 //! Compare libc's CMSG(3) family of functions against the actual C macros, for
2 //! various inputs.
3 
4 extern crate libc;
5 
6 #[cfg(unix)]
7 mod t {
8 
9     use libc::{self, c_uchar, c_uint, c_void, cmsghdr, msghdr};
10     use std::mem;
11 
12     extern "C" {
13         pub fn cmsg_firsthdr(msgh: *const msghdr) -> *mut cmsghdr;
14         pub fn cmsg_nxthdr(
15             mhdr: *const msghdr,
16             cmsg: *const cmsghdr,
17         ) -> *mut cmsghdr;
18         pub fn cmsg_space(length: c_uint) -> usize;
19         pub fn cmsg_len(length: c_uint) -> usize;
20         pub fn cmsg_data(cmsg: *const cmsghdr) -> *mut c_uchar;
21     }
22 
23     #[test]
24     fn test_cmsg_data() {
25         for l in 0..128 {
26             let pcmsghdr = l as *const cmsghdr;
27             unsafe {
28                 assert_eq!(libc::CMSG_DATA(pcmsghdr), cmsg_data(pcmsghdr));
29             }
30         }
31     }
32 
33     #[test]
34     fn test_cmsg_firsthdr() {
35         let mut mhdr: msghdr = unsafe { mem::zeroed() };
36         mhdr.msg_control = 0xdeadbeef as *mut c_void;
37         let pmhdr = &mhdr as *const msghdr;
38         for l in 0..128 {
39             mhdr.msg_controllen = l;
40             unsafe {
41                 assert_eq!(libc::CMSG_FIRSTHDR(pmhdr), cmsg_firsthdr(pmhdr));
42             }
43         }
44     }
45 
46     #[test]
47     fn test_cmsg_len() {
48         for l in 0..128 {
49             unsafe {
50                 assert_eq!(libc::CMSG_LEN(l) as usize, cmsg_len(l));
51             }
52         }
53     }
54 
55     // Skip on sparc64
56     // https://github.com/rust-lang/libc/issues/1239
57     #[cfg(not(target_arch = "sparc64"))]
58     #[test]
59     fn test_cmsg_nxthdr() {
60         use std::ptr;
61 
62         let mut buffer = [0u8; 256];
63         let mut mhdr: msghdr = unsafe { mem::zeroed() };
64         let pmhdr = &mhdr as *const msghdr;
65         for start_ofs in 0..64 {
66             let pcmsghdr = &mut buffer[start_ofs] as *mut u8 as *mut cmsghdr;
67             mhdr.msg_control = pcmsghdr as *mut c_void;
68             mhdr.msg_controllen = (160 - start_ofs) as _;
69             for cmsg_len in 0..64 {
70                 for next_cmsg_len in 0..32 {
71                     for i in buffer[start_ofs..].iter_mut() {
72                         *i = 0;
73                     }
74                     unsafe {
75                         (*pcmsghdr).cmsg_len = cmsg_len;
76                         let libc_next = libc::CMSG_NXTHDR(pmhdr, pcmsghdr);
77                         let next = cmsg_nxthdr(pmhdr, pcmsghdr);
78                         assert_eq!(libc_next, next);
79 
80                         if libc_next != ptr::null_mut() {
81                             (*libc_next).cmsg_len = next_cmsg_len;
82                             let libc_next = libc::CMSG_NXTHDR(pmhdr, pcmsghdr);
83                             let next = cmsg_nxthdr(pmhdr, pcmsghdr);
84                             assert_eq!(libc_next, next);
85                         }
86                     }
87                 }
88             }
89         }
90     }
91 
92     #[test]
93     fn test_cmsg_space() {
94         unsafe {
95             for l in 0..128 {
96                 assert_eq!(libc::CMSG_SPACE(l) as usize, cmsg_space(l));
97             }
98         }
99     }
100 }
101