Skip to content

Commit b35564f

Browse files
committed
Migrate sys/socket to libc FFI types.
1 parent 9f4db8a commit b35564f

File tree

2 files changed

+34
-110
lines changed

2 files changed

+34
-110
lines changed

src/sys/socket/ffi.rs

Lines changed: 0 additions & 81 deletions
This file was deleted.

src/sys/socket/mod.rs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use sys::time::TimeVal;
1010
use sys::uio::IoVec;
1111

1212
mod addr;
13-
mod ffi;
1413
mod multicast;
1514
pub mod sockopt;
1615

@@ -33,13 +32,15 @@ pub use self::addr::{
3332
pub use ::sys::socket::addr::netlink::NetlinkAddr;
3433

3534
pub use libc::{
35+
cmsghdr,
3636
in_addr,
3737
in6_addr,
38+
msghdr,
39+
sa_family_t,
3840
sockaddr,
3941
sockaddr_in,
4042
sockaddr_in6,
4143
sockaddr_un,
42-
sa_family_t,
4344
};
4445

4546
pub use self::multicast::{
@@ -187,8 +188,12 @@ unsafe fn copy_bytes<'a, 'b, T: ?Sized>(src: &T, dst: &'a mut &'b mut [u8]) {
187188
mem::swap(dst, &mut remainder);
188189
}
189190

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;
190194

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;
192197

193198
/// A structure used to make room in a cmsghdr passed to recvmsg. The
194199
/// 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_
198203
/// To make room for multiple messages, nest the type parameter with
199204
/// tuples, e.g.
200205
/// `let cmsg: CmsgSpace<([RawFd; 3], CmsgSpace<[RawFd; 2]>)> = CmsgSpace::new();`
206+
#[repr(C)]
201207
pub struct CmsgSpace<T> {
202208
_hdr: cmsghdr,
209+
_pad: [align_of_cmsg_data; 0],
203210
_data: T,
204211
}
205212

@@ -269,24 +276,25 @@ impl<'a> Iterator for CmsgIterator<'a> {
269276
if aligned_cmsg_len > self.buf.len() {
270277
return None;
271278
}
279+
let cmsg_data = &self.buf[cmsg_align(sizeof_cmsghdr)..cmsg_len];
272280
self.buf = &self.buf[aligned_cmsg_len..];
273281
self.next += 1;
274282

275283
match (cmsg.cmsg_level, cmsg.cmsg_type) {
276284
(libc::SOL_SOCKET, libc::SCM_RIGHTS) => unsafe {
277285
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>())))
280288
},
281289
(libc::SOL_SOCKET, libc::SCM_TIMESTAMP) => unsafe {
282290
Some(ControlMessage::ScmTimestamp(
283-
&*(&cmsg.cmsg_data as *const _ as *const _)))
291+
&*(cmsg_data.as_ptr() as *const _)))
284292
},
285293
(_, _) => unsafe {
286294
Some(ControlMessage::Unknown(UnknownCmsg(
287295
&cmsg,
288296
slice::from_raw_parts(
289-
&cmsg.cmsg_data as *const _ as *const _,
297+
cmsg_data.as_ptr() as *const _,
290298
len))))
291299
}
292300
}
@@ -380,7 +388,7 @@ pub enum ControlMessage<'a> {
380388
pub struct UnknownCmsg<'a>(&'a cmsghdr, &'a [u8]);
381389

382390
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;
384392
(len + align_bytes) & !align_bytes
385393
}
386394

@@ -405,17 +413,15 @@ impl<'a> ControlMessage<'a> {
405413
}
406414
}
407415

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.
411418
unsafe fn encode_into<'b>(&self, buf: &mut &'b mut [u8]) {
412419
match *self {
413420
ControlMessage::ScmRights(fds) => {
414421
let cmsg = cmsghdr {
415-
cmsg_len: self.len() as type_of_cmsg_len,
422+
cmsg_len: self.len() as _,
416423
cmsg_level: libc::SOL_SOCKET,
417424
cmsg_type: libc::SCM_RIGHTS,
418-
cmsg_data: [],
419425
};
420426
copy_bytes(&cmsg, buf);
421427

@@ -431,10 +437,9 @@ impl<'a> ControlMessage<'a> {
431437
},
432438
ControlMessage::ScmTimestamp(t) => {
433439
let cmsg = cmsghdr {
434-
cmsg_len: self.len() as type_of_cmsg_len,
440+
cmsg_len: self.len() as _,
435441
cmsg_level: libc::SOL_SOCKET,
436442
cmsg_type: libc::SCM_TIMESTAMP,
437-
cmsg_data: [],
438443
};
439444
copy_bytes(&cmsg, buf);
440445

@@ -495,15 +500,15 @@ pub fn sendmsg<'a>(fd: RawFd, iov: &[IoVec<&'a [u8]>], cmsgs: &[ControlMessage<'
495500
};
496501

497502
let mhdr = msghdr {
498-
msg_name: name as *const c_void,
503+
msg_name: name as *mut _,
499504
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 _,
504509
msg_flags: 0,
505510
};
506-
let ret = unsafe { ffi::sendmsg(fd, &mhdr, flags.bits()) };
511+
let ret = unsafe { libc::sendmsg(fd, &mhdr, flags.bits()) };
507512

508513
Errno::result(ret).map(|r| r as usize)
509514
}
@@ -518,15 +523,15 @@ pub fn recvmsg<'a, T>(fd: RawFd, iov: &[IoVec<&mut [u8]>], cmsg_buffer: Option<&
518523
None => (0 as *mut _, 0),
519524
};
520525
let mut mhdr = msghdr {
521-
msg_name: &mut address as *const _ as *const c_void,
526+
msg_name: &mut address as *mut _ as *mut _,
522527
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 _,
527532
msg_flags: 0,
528533
};
529-
let ret = unsafe { ffi::recvmsg(fd, &mut mhdr, flags.bits()) };
534+
let ret = unsafe { libc::recvmsg(fd, &mut mhdr, flags.bits()) };
530535

531536
Ok(unsafe { RecvMsg {
532537
bytes: try!(Errno::result(ret)) as usize,
@@ -743,7 +748,7 @@ pub fn connect(fd: RawFd, addr: &SockAddr) -> Result<()> {
743748
/// [Further reading](http://man7.org/linux/man-pages/man2/recv.2.html)
744749
pub fn recv(sockfd: RawFd, buf: &mut [u8], flags: MsgFlags) -> Result<usize> {
745750
unsafe {
746-
let ret = ffi::recv(
751+
let ret = libc::recv(
747752
sockfd,
748753
buf.as_ptr() as *mut c_void,
749754
buf.len() as size_t,
@@ -762,7 +767,7 @@ pub fn recvfrom(sockfd: RawFd, buf: &mut [u8]) -> Result<(usize, SockAddr)> {
762767
let addr: sockaddr_storage = mem::zeroed();
763768
let mut len = mem::size_of::<sockaddr_storage>() as socklen_t;
764769

765-
let ret = try!(Errno::result(ffi::recvfrom(
770+
let ret = try!(Errno::result(libc::recvfrom(
766771
sockfd,
767772
buf.as_ptr() as *mut c_void,
768773
buf.len() as size_t,

0 commit comments

Comments
 (0)