@@ -10,7 +10,6 @@ use sys::time::TimeVal;
10
10
use sys:: uio:: IoVec ;
11
11
12
12
mod addr;
13
- mod ffi;
14
13
mod multicast;
15
14
pub mod sockopt;
16
15
@@ -33,13 +32,15 @@ pub use self::addr::{
33
32
pub use :: sys:: socket:: addr:: netlink:: NetlinkAddr ;
34
33
35
34
pub use libc:: {
35
+ cmsghdr,
36
36
in_addr,
37
37
in6_addr,
38
+ msghdr,
39
+ sa_family_t,
38
40
sockaddr,
39
41
sockaddr_in,
40
42
sockaddr_in6,
41
43
sockaddr_un,
42
- sa_family_t,
43
44
} ;
44
45
45
46
pub use self :: multicast:: {
@@ -187,8 +188,12 @@ unsafe fn copy_bytes<'a, 'b, T: ?Sized>(src: &T, dst: &'a mut &'b mut [u8]) {
187
188
mem:: swap ( dst, & mut remainder) ;
188
189
}
189
190
191
+ // OSX always aligns struct cmsghdr as if it were a 32-bit OS
192
+ #[ cfg( target_os = "macos" ) ]
193
+ type align_of_cmsg_data = libc:: c_uint ;
190
194
191
- use self :: ffi:: { cmsghdr, msghdr, type_of_cmsg_data, type_of_msg_iovlen, type_of_cmsg_len} ;
195
+ #[ cfg( not( target_os = "macos" ) ) ]
196
+ type align_of_cmsg_data = size_t ;
192
197
193
198
/// A structure used to make room in a cmsghdr passed to recvmsg. The
194
199
/// size and alignment match that of a cmsghdr followed by a T, but the
@@ -198,8 +203,10 @@ use self::ffi::{cmsghdr, msghdr, type_of_cmsg_data, type_of_msg_iovlen, type_of_
198
203
/// To make room for multiple messages, nest the type parameter with
199
204
/// tuples, e.g.
200
205
/// `let cmsg: CmsgSpace<([RawFd; 3], CmsgSpace<[RawFd; 2]>)> = CmsgSpace::new();`
206
+ #[ repr( C ) ]
201
207
pub struct CmsgSpace < T > {
202
208
_hdr : cmsghdr ,
209
+ _pad : [ align_of_cmsg_data ; 0 ] ,
203
210
_data : T ,
204
211
}
205
212
@@ -269,24 +276,25 @@ impl<'a> Iterator for CmsgIterator<'a> {
269
276
if aligned_cmsg_len > self . buf . len ( ) {
270
277
return None ;
271
278
}
279
+ let cmsg_data = & self . buf [ cmsg_align ( sizeof_cmsghdr) ..cmsg_len] ;
272
280
self . buf = & self . buf [ aligned_cmsg_len..] ;
273
281
self . next += 1 ;
274
282
275
283
match ( cmsg. cmsg_level , cmsg. cmsg_type ) {
276
284
( libc:: SOL_SOCKET , libc:: SCM_RIGHTS ) => unsafe {
277
285
Some ( ControlMessage :: ScmRights (
278
- slice:: from_raw_parts (
279
- & cmsg . cmsg_data as * const _ as * const _ , 1 ) ) )
286
+ slice:: from_raw_parts ( cmsg_data . as_ptr ( ) as * const _ ,
287
+ cmsg_data . len ( ) / mem :: size_of :: < RawFd > ( ) ) ) )
280
288
} ,
281
289
( libc:: SOL_SOCKET , libc:: SCM_TIMESTAMP ) => unsafe {
282
290
Some ( ControlMessage :: ScmTimestamp (
283
- & * ( & cmsg . cmsg_data as * const _ as * const _ ) ) )
291
+ & * ( cmsg_data. as_ptr ( ) as * const _ ) ) )
284
292
} ,
285
293
( _, _) => unsafe {
286
294
Some ( ControlMessage :: Unknown ( UnknownCmsg (
287
295
& cmsg,
288
296
slice:: from_raw_parts (
289
- & cmsg . cmsg_data as * const _ as * const _ ,
297
+ cmsg_data. as_ptr ( ) as * const _ ,
290
298
len) ) ) )
291
299
}
292
300
}
@@ -380,7 +388,7 @@ pub enum ControlMessage<'a> {
380
388
pub struct UnknownCmsg < ' a > ( & ' a cmsghdr , & ' a [ u8 ] ) ;
381
389
382
390
fn cmsg_align ( len : usize ) -> usize {
383
- let align_bytes = mem:: size_of :: < type_of_cmsg_data > ( ) - 1 ;
391
+ let align_bytes = mem:: size_of :: < align_of_cmsg_data > ( ) - 1 ;
384
392
( len + align_bytes) & !align_bytes
385
393
}
386
394
@@ -405,17 +413,15 @@ impl<'a> ControlMessage<'a> {
405
413
}
406
414
}
407
415
408
- // Unsafe: start and end of buffer must be size_t-aligned (that is,
409
- // cmsg_align'd). Updates the provided slice; panics if the buffer
410
- // is too small.
416
+ // Unsafe: start and end of buffer must be cmsg_align'd. Updates
417
+ // the provided slice; panics if the buffer is too small.
411
418
unsafe fn encode_into < ' b > ( & self , buf : & mut & ' b mut [ u8 ] ) {
412
419
match * self {
413
420
ControlMessage :: ScmRights ( fds) => {
414
421
let cmsg = cmsghdr {
415
- cmsg_len : self . len ( ) as type_of_cmsg_len ,
422
+ cmsg_len : self . len ( ) as _ ,
416
423
cmsg_level : libc:: SOL_SOCKET ,
417
424
cmsg_type : libc:: SCM_RIGHTS ,
418
- cmsg_data : [ ] ,
419
425
} ;
420
426
copy_bytes ( & cmsg, buf) ;
421
427
@@ -431,10 +437,9 @@ impl<'a> ControlMessage<'a> {
431
437
} ,
432
438
ControlMessage :: ScmTimestamp ( t) => {
433
439
let cmsg = cmsghdr {
434
- cmsg_len : self . len ( ) as type_of_cmsg_len ,
440
+ cmsg_len : self . len ( ) as _ ,
435
441
cmsg_level : libc:: SOL_SOCKET ,
436
442
cmsg_type : libc:: SCM_TIMESTAMP ,
437
- cmsg_data : [ ] ,
438
443
} ;
439
444
copy_bytes ( & cmsg, buf) ;
440
445
@@ -495,15 +500,15 @@ pub fn sendmsg<'a>(fd: RawFd, iov: &[IoVec<&'a [u8]>], cmsgs: &[ControlMessage<'
495
500
} ;
496
501
497
502
let mhdr = msghdr {
498
- msg_name : name as * const c_void ,
503
+ msg_name : name as * mut _ ,
499
504
msg_namelen : namelen,
500
- msg_iov : iov. as_ptr ( ) ,
501
- msg_iovlen : iov. len ( ) as type_of_msg_iovlen ,
502
- msg_control : cmsg_ptr,
503
- msg_controllen : capacity as type_of_cmsg_len ,
505
+ msg_iov : iov. as_ptr ( ) as * mut _ ,
506
+ msg_iovlen : iov. len ( ) as _ ,
507
+ msg_control : cmsg_ptr as * mut _ ,
508
+ msg_controllen : capacity as _ ,
504
509
msg_flags : 0 ,
505
510
} ;
506
- let ret = unsafe { ffi :: sendmsg ( fd, & mhdr, flags. bits ( ) ) } ;
511
+ let ret = unsafe { libc :: sendmsg ( fd, & mhdr, flags. bits ( ) ) } ;
507
512
508
513
Errno :: result ( ret) . map ( |r| r as usize )
509
514
}
@@ -518,15 +523,15 @@ pub fn recvmsg<'a, T>(fd: RawFd, iov: &[IoVec<&mut [u8]>], cmsg_buffer: Option<&
518
523
None => ( 0 as * mut _ , 0 ) ,
519
524
} ;
520
525
let mut mhdr = msghdr {
521
- msg_name : & mut address as * const _ as * const c_void ,
526
+ msg_name : & mut address as * mut _ as * mut _ ,
522
527
msg_namelen : mem:: size_of :: < sockaddr_storage > ( ) as socklen_t ,
523
- msg_iov : iov. as_ptr ( ) as * const IoVec < & [ u8 ] > , // safe cast to add const-ness
524
- msg_iovlen : iov. len ( ) as type_of_msg_iovlen ,
525
- msg_control : msg_control as * const c_void ,
526
- msg_controllen : msg_controllen as type_of_cmsg_len ,
528
+ msg_iov : iov. as_ptr ( ) as * mut _ ,
529
+ msg_iovlen : iov. len ( ) as _ ,
530
+ msg_control : msg_control as * mut _ ,
531
+ msg_controllen : msg_controllen as _ ,
527
532
msg_flags : 0 ,
528
533
} ;
529
- let ret = unsafe { ffi :: recvmsg ( fd, & mut mhdr, flags. bits ( ) ) } ;
534
+ let ret = unsafe { libc :: recvmsg ( fd, & mut mhdr, flags. bits ( ) ) } ;
530
535
531
536
Ok ( unsafe { RecvMsg {
532
537
bytes : try!( Errno :: result ( ret) ) as usize ,
@@ -743,7 +748,7 @@ pub fn connect(fd: RawFd, addr: &SockAddr) -> Result<()> {
743
748
/// [Further reading](http://man7.org/linux/man-pages/man2/recv.2.html)
744
749
pub fn recv ( sockfd : RawFd , buf : & mut [ u8 ] , flags : MsgFlags ) -> Result < usize > {
745
750
unsafe {
746
- let ret = ffi :: recv (
751
+ let ret = libc :: recv (
747
752
sockfd,
748
753
buf. as_ptr ( ) as * mut c_void ,
749
754
buf. len ( ) as size_t ,
@@ -762,7 +767,7 @@ pub fn recvfrom(sockfd: RawFd, buf: &mut [u8]) -> Result<(usize, SockAddr)> {
762
767
let addr: sockaddr_storage = mem:: zeroed ( ) ;
763
768
let mut len = mem:: size_of :: < sockaddr_storage > ( ) as socklen_t ;
764
769
765
- let ret = try!( Errno :: result ( ffi :: recvfrom (
770
+ let ret = try!( Errno :: result ( libc :: recvfrom (
766
771
sockfd,
767
772
buf. as_ptr ( ) as * mut c_void ,
768
773
buf. len ( ) as size_t ,
0 commit comments