aboutsummaryrefslogtreecommitdiff
path: root/src/sys/unix/udp.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/unix/udp.rs')
-rw-r--r--src/sys/unix/udp.rs20
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> {