diff options
Diffstat (limited to 'src/libnative')
| -rw-r--r-- | src/libnative/io/net.rs | 35 | ||||
| -rw-r--r-- | src/libnative/io/pipe_unix.rs | 22 |
2 files changed, 30 insertions, 27 deletions
diff --git a/src/libnative/io/net.rs b/src/libnative/io/net.rs index cf2d6e7fb45..a5332c8d077 100644 --- a/src/libnative/io/net.rs +++ b/src/libnative/io/net.rs @@ -66,26 +66,27 @@ fn ip_to_inaddr(ip: rtio::IpAddr) -> InAddr { } } -fn addr_to_sockaddr(addr: rtio::SocketAddr) -> (libc::sockaddr_storage, uint) { +fn addr_to_sockaddr(addr: rtio::SocketAddr, + storage: &mut libc::sockaddr_storage) + -> libc::socklen_t { unsafe { - let storage: libc::sockaddr_storage = mem::zeroed(); let len = match ip_to_inaddr(addr.ip) { InAddr(inaddr) => { - let storage: *mut libc::sockaddr_in = mem::transmute(&storage); + let storage = storage as *mut _ as *mut libc::sockaddr_in; (*storage).sin_family = libc::AF_INET as libc::sa_family_t; (*storage).sin_port = htons(addr.port); (*storage).sin_addr = inaddr; mem::size_of::<libc::sockaddr_in>() } In6Addr(inaddr) => { - let storage: *mut libc::sockaddr_in6 = mem::transmute(&storage); + let storage = storage as *mut _ as *mut libc::sockaddr_in6; (*storage).sin6_family = libc::AF_INET6 as libc::sa_family_t; (*storage).sin6_port = htons(addr.port); (*storage).sin6_addr = inaddr; mem::size_of::<libc::sockaddr_in6>() } }; - return (storage, len); + return len as libc::socklen_t; } } @@ -277,9 +278,9 @@ impl TcpStream { let fd = try!(socket(addr, libc::SOCK_STREAM)); let ret = TcpStream::new(Inner::new(fd)); - let (addr, len) = addr_to_sockaddr(addr); - let addrp = &addr as *const _ as *const libc::sockaddr; - let len = len as libc::socklen_t; + let mut storage = unsafe { mem::zeroed() }; + let len = addr_to_sockaddr(addr, &mut storage); + let addrp = &storage as *const _ as *const libc::sockaddr; match timeout { Some(timeout) => { @@ -457,9 +458,9 @@ impl TcpListener { let fd = try!(socket(addr, libc::SOCK_STREAM)); let ret = TcpListener { inner: Inner::new(fd) }; - let (addr, len) = addr_to_sockaddr(addr); - let addrp = &addr as *const _ as *const libc::sockaddr; - let len = len as libc::socklen_t; + let mut storage = unsafe { mem::zeroed() }; + let len = addr_to_sockaddr(addr, &mut storage); + let addrp = &storage as *const _ as *const libc::sockaddr; // On platforms with Berkeley-derived sockets, this allows // to quickly rebind a socket, without needing to wait for @@ -566,9 +567,9 @@ impl UdpSocket { write_deadline: 0, }; - let (addr, len) = addr_to_sockaddr(addr); - let addrp = &addr as *const _ as *const libc::sockaddr; - let len = len as libc::socklen_t; + let mut storage = unsafe { mem::zeroed() }; + let len = addr_to_sockaddr(addr, &mut storage); + let addrp = &storage as *const _ as *const libc::sockaddr; match unsafe { libc::bind(fd, addrp, len) } { -1 => Err(last_error()), @@ -656,9 +657,9 @@ impl rtio::RtioUdpSocket for UdpSocket { } fn send_to(&mut self, buf: &[u8], dst: rtio::SocketAddr) -> IoResult<()> { - let (dst, dstlen) = addr_to_sockaddr(dst); - let dstp = &dst as *const _ as *const libc::sockaddr; - let dstlen = dstlen as libc::socklen_t; + let mut storage = unsafe { mem::zeroed() }; + let dstlen = addr_to_sockaddr(dst, &mut storage); + let dstp = &storage as *const _ as *const libc::sockaddr; let fd = self.fd(); let dolock = || self.lock_nonblocking(); diff --git a/src/libnative/io/pipe_unix.rs b/src/libnative/io/pipe_unix.rs index 075ca769d07..bc3f917a3dc 100644 --- a/src/libnative/io/pipe_unix.rs +++ b/src/libnative/io/pipe_unix.rs @@ -29,12 +29,13 @@ fn unix_socket(ty: libc::c_int) -> IoResult<fd_t> { } } -fn addr_to_sockaddr_un(addr: &CString) -> IoResult<(libc::sockaddr_storage, uint)> { +fn addr_to_sockaddr_un(addr: &CString, + storage: &mut libc::sockaddr_storage) + -> IoResult<libc::socklen_t> { // the sun_path length is limited to SUN_LEN (with null) assert!(mem::size_of::<libc::sockaddr_storage>() >= mem::size_of::<libc::sockaddr_un>()); - let mut storage: libc::sockaddr_storage = unsafe { mem::zeroed() }; - let s: &mut libc::sockaddr_un = unsafe { mem::transmute(&mut storage) }; + let s = unsafe { &mut *(storage as *mut _ as *mut libc::sockaddr_un) }; let len = addr.len(); if len > s.sun_path.len() - 1 { @@ -53,7 +54,7 @@ fn addr_to_sockaddr_un(addr: &CString) -> IoResult<(libc::sockaddr_storage, uint // count the null terminator let len = mem::size_of::<libc::sa_family_t>() + len + 1; - return Ok((storage, len)); + return Ok(len as libc::socklen_t); } struct Inner { @@ -76,10 +77,10 @@ impl Drop for Inner { fn connect(addr: &CString, ty: libc::c_int, timeout: Option<u64>) -> IoResult<Inner> { - let (addr, len) = try!(addr_to_sockaddr_un(addr)); + let mut storage = unsafe { mem::zeroed() }; + let len = try!(addr_to_sockaddr_un(addr, &mut storage)); let inner = Inner::new(try!(unix_socket(ty))); - let addrp = &addr as *const _ as *const libc::sockaddr; - let len = len as libc::socklen_t; + let addrp = &storage as *const _ as *const libc::sockaddr; match timeout { None => { @@ -96,11 +97,12 @@ fn connect(addr: &CString, ty: libc::c_int, } fn bind(addr: &CString, ty: libc::c_int) -> IoResult<Inner> { - let (addr, len) = try!(addr_to_sockaddr_un(addr)); + let mut storage = unsafe { mem::zeroed() }; + let len = try!(addr_to_sockaddr_un(addr, &mut storage)); let inner = Inner::new(try!(unix_socket(ty))); - let addrp = &addr as *const _; + let addrp = &storage as *const _ as *const libc::sockaddr; match unsafe { - libc::bind(inner.fd, addrp as *const _, len as libc::socklen_t) + libc::bind(inner.fd, addrp, len) } { -1 => Err(super::last_error()), _ => Ok(inner) |
