//! Unix-specific extensions to the `std::net` types. use std::io; use sys::c::{self, c_int}; use {TcpBuilder, UdpBuilder}; use ext::{self, AsSock}; /// Unix-specific extensions for the `TcpBuilder` type in this library. pub trait UnixTcpBuilderExt { /// Set value for the `SO_REUSEPORT` option on this socket. /// /// This indicates that further calls to `bind` may allow reuse of local /// addresses. For IPv4 sockets this means that a socket may bind even when /// there's a socket already listening on this port. fn reuse_port(&self, reuse: bool) -> io::Result<&Self>; /// Check the value of the `SO_REUSEPORT` option on this socket. fn get_reuse_port(&self) -> io::Result; } impl UnixTcpBuilderExt for TcpBuilder { fn reuse_port(&self, reuse: bool) -> io::Result<&Self> { ext::set_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT, reuse as c_int).map(|()| self) } fn get_reuse_port(&self) -> io::Result { ext::get_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT) .map(ext::int2bool) } } /// Unix-specific extensions for the `UdpBuilder` type in this library. pub trait UnixUdpBuilderExt { /// Set value for the `SO_REUSEPORT` option on this socket. /// /// This indicates that further calls to `bind` may allow reuse of local /// addresses. For IPv4 sockets this means that a socket may bind even when /// there's a socket already listening on this port. fn reuse_port(&self, reuse: bool) -> io::Result<&Self>; /// Check the value of the `SO_REUSEPORT` option on this socket. fn get_reuse_port(&self) -> io::Result; } impl UnixUdpBuilderExt for UdpBuilder { fn reuse_port(&self, reuse: bool) -> io::Result<&Self> { ext::set_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT, reuse as c_int).map(|()| self) } fn get_reuse_port(&self) -> io::Result { ext::get_opt(self.as_sock(), c::SOL_SOCKET, c::SO_REUSEPORT) .map(ext::int2bool) } }