@@ -85,7 +85,8 @@ unsafe fn copy_bytes<'a, 'b, T: ?Sized>(src: &T, dst: &'a mut &'b mut [u8]) {
85
85
}
86
86
87
87
88
- use self :: ffi:: { cmsghdr, msghdr, type_of_cmsg_len, type_of_cmsg_data} ;
88
+ use self :: ffi:: { cmsghdr, msghdr, type_of_cmsg_len, align_of_cmsg_data,
89
+ type_of_msgiov_len, type_of_msg_controllen} ;
89
90
90
91
/// A structure used to make room in a cmsghdr passed to recvmsg. The
91
92
/// size and alignment match that of a cmsghdr followed by a T, but the
@@ -97,6 +98,8 @@ use self::ffi::{cmsghdr, msghdr, type_of_cmsg_len, type_of_cmsg_data};
97
98
/// `let cmsg: CmsgSpace<([RawFd; 3], CmsgSpace<[RawFd; 2]>)> = CmsgSpace::new();`
98
99
pub struct CmsgSpace < T > {
99
100
_hdr : cmsghdr ,
101
+ #[ cfg( not( target_os = "macos" ) ) ]
102
+ _pad : [ align_of_cmsg_data ; 0 ] ,
100
103
_data : T ,
101
104
}
102
105
@@ -156,17 +159,18 @@ impl<'a> Iterator for CmsgIterator<'a> {
156
159
}
157
160
self . 0 = & buf[ cmsg_align ( cmsg_len) ..] ;
158
161
162
+ let cmsg_data = & buf[ cmsg_align ( sizeof_cmsghdr) ..] ;
159
163
match ( cmsg. cmsg_level , cmsg. cmsg_type ) {
160
164
( SOL_SOCKET , SCM_RIGHTS ) => unsafe {
161
165
Some ( ControlMessage :: ScmRights (
162
166
slice:: from_raw_parts (
163
- & cmsg . cmsg_data as * const _ as * const _ , 1 ) ) )
167
+ cmsg_data. as_ptr ( ) as * const _ , 1 ) ) )
164
168
} ,
165
169
( _, _) => unsafe {
166
170
Some ( ControlMessage :: Unknown ( UnknownCmsg (
167
171
& cmsg,
168
172
slice:: from_raw_parts (
169
- & cmsg . cmsg_data as * const _ as * const _ ,
173
+ cmsg_data. as_ptr ( ) as * const _ ,
170
174
len) ) ) )
171
175
}
172
176
}
@@ -191,7 +195,7 @@ pub enum ControlMessage<'a> {
191
195
pub struct UnknownCmsg < ' a > ( & ' a cmsghdr , & ' a [ u8 ] ) ;
192
196
193
197
fn cmsg_align ( len : usize ) -> usize {
194
- let align_bytes = mem:: size_of :: < type_of_cmsg_data > ( ) - 1 ;
198
+ let align_bytes = mem:: size_of :: < align_of_cmsg_data > ( ) - 1 ;
195
199
( len + align_bytes) & !align_bytes
196
200
}
197
201
@@ -213,8 +217,8 @@ impl<'a> ControlMessage<'a> {
213
217
}
214
218
}
215
219
216
- // Unsafe: start and end of buffer must be size_t-aligned (that is,
217
- // cmsg_align'd). Updates the provided slice; panics if the buffer
220
+ // Unsafe: start and end of buffer must be cmsg_align'd.
221
+ // Updates the provided slice; panics if the buffer
218
222
// is too small.
219
223
unsafe fn encode_into < ' b > ( & self , buf : & mut & ' b mut [ u8 ] ) {
220
224
match * self {
@@ -223,7 +227,6 @@ impl<'a> ControlMessage<'a> {
223
227
cmsg_len : self . len ( ) as type_of_cmsg_len ,
224
228
cmsg_level : SOL_SOCKET ,
225
229
cmsg_type : SCM_RIGHTS ,
226
- cmsg_data : [ ] ,
227
230
} ;
228
231
copy_bytes ( & cmsg, buf) ;
229
232
@@ -287,9 +290,9 @@ pub fn sendmsg<'a>(fd: RawFd, iov: &[IoVec<&'a [u8]>], cmsgs: &[ControlMessage<'
287
290
msg_name : name as * const c_void ,
288
291
msg_namelen : namelen,
289
292
msg_iov : iov. as_ptr ( ) ,
290
- msg_iovlen : iov. len ( ) as size_t ,
293
+ msg_iovlen : iov. len ( ) as type_of_msgiov_len ,
291
294
msg_control : cmsg_ptr,
292
- msg_controllen : capacity as size_t ,
295
+ msg_controllen : capacity as type_of_msg_controllen ,
293
296
msg_flags : 0 ,
294
297
} ;
295
298
let ret = unsafe { ffi:: sendmsg ( fd, & mhdr, flags. bits ( ) ) } ;
@@ -310,9 +313,9 @@ pub fn recvmsg<'a, T>(fd: RawFd, iov: &[IoVec<&mut [u8]>], cmsg_buffer: Option<&
310
313
msg_name : & mut address as * const _ as * const c_void ,
311
314
msg_namelen : mem:: size_of :: < sockaddr_storage > ( ) as socklen_t ,
312
315
msg_iov : iov. as_ptr ( ) as * const IoVec < & [ u8 ] > , // safe cast to add const-ness
313
- msg_iovlen : iov. len ( ) as size_t ,
316
+ msg_iovlen : iov. len ( ) as type_of_msgiov_len ,
314
317
msg_control : msg_control as * const c_void ,
315
- msg_controllen : msg_controllen as size_t ,
318
+ msg_controllen : msg_controllen as type_of_msg_controllen ,
316
319
msg_flags : 0 ,
317
320
} ;
318
321
let ret = unsafe { ffi:: recvmsg ( fd, & mut mhdr, flags. bits ( ) ) } ;
@@ -692,6 +695,8 @@ pub fn shutdown(df: RawFd, how: Shutdown) -> Result<()> {
692
695
693
696
#[ test]
694
697
pub fn test_struct_sizes ( ) {
695
- use nixtest;
696
- nixtest:: assert_size_of :: < sockaddr_storage > ( "sockaddr_storage" ) ;
698
+ use nixtest:: assert_size_of;
699
+ assert_size_of :: < sockaddr_storage > ( "sockaddr_storage" ) ;
700
+ assert_size_of :: < msghdr > ( "msghdr" ) ;
701
+ assert_size_of :: < cmsghdr > ( "cmsghdr" ) ;
697
702
}
0 commit comments