diff options
Diffstat (limited to 'src/sys/unix/udp.rs')
-rw-r--r-- | src/sys/unix/udp.rs | 20 |
1 files changed, 6 insertions, 14 deletions
diff --git a/src/sys/unix/udp.rs b/src/sys/unix/udp.rs index 5a97cbd..843ae88 100644 --- a/src/sys/unix/udp.rs +++ b/src/sys/unix/udp.rs @@ -6,21 +6,13 @@ use std::net::{self, SocketAddr}; use std::os::unix::io::{AsRawFd, FromRawFd}; pub fn bind(addr: SocketAddr) -> io::Result<net::UdpSocket> { - // Gives a warning for non Apple platforms. - #[allow(clippy::let_and_return)] - let socket = new_ip_socket(addr, libc::SOCK_DGRAM); + let fd = new_ip_socket(addr, libc::SOCK_DGRAM)?; + let socket = unsafe { net::UdpSocket::from_raw_fd(fd) }; - socket.and_then(|socket| { - let (raw_addr, raw_addr_length) = socket_addr(&addr); - syscall!(bind(socket, raw_addr.as_ptr(), raw_addr_length)) - .map_err(|err| { - // Close the socket if we hit an error, ignoring the error - // from closing since we can't pass back two errors. - let _ = unsafe { libc::close(socket) }; - err - }) - .map(|_| unsafe { net::UdpSocket::from_raw_fd(socket) }) - }) + let (raw_addr, raw_addr_length) = socket_addr(&addr); + syscall!(bind(fd, raw_addr.as_ptr(), raw_addr_length))?; + + Ok(socket) } pub(crate) fn only_v6(socket: &net::UdpSocket) -> io::Result<bool> { |