#[cfg(target_family = "unix")]
pub extern crate libc;
pub extern crate uds_fork;
#[cfg(target_family = "windows")]
pub extern crate windows_sys;
extern crate bitfield;
extern crate bitflags;
#[cfg(target_family = "unix")]
mod unix;
#[cfg(target_family = "windows")]
mod windows;
pub mod common;
pub mod socket;
pub mod socket_split;
pub mod address;
pub mod socket_impls;
pub mod op_sol_socket;
mod op_iproto_ip;
mod op_sol_ip;
mod op_ipproto_ip6;
mod op_sol_ip6;
mod op_ipproto_tcp;
#[cfg(target_family = "windows")]
use std::os::windows::io::{AsRawSocket, AsSocket, BorrowedSocket, RawSocket};
#[cfg(target_family = "unix")]
use std::os::
{
fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd},
unix::net::{UnixDatagram, UnixStream}
};
use std::
{
ffi::c_int,
io::{self},
net::{Ipv4Addr, Ipv6Addr, TcpListener, TcpStream, UdpSocket},
time::Duration
};
#[cfg(target_family = "unix")]
use uds_fork::{UnixSeqpacketConn, UnixSeqpacketListener};
use crate::
{
op_ipproto_ip6::*, op_ipproto_tcp::*, op_iproto_ip::*,
op_sol_ip::*, op_sol_ip6::*, op_sol_socket::*
};
pub(crate) use common::{SocketTypeImps, SockTypeFromRaw};
pub use socket::*;
pub use uds_fork::{UnixSocketAddr, UnixSocketAddrRef};
pub use address::{So9DomainUnix, So9DomainInets};
#[cfg(target_family = "unix")]
pub use crate::unix::*;
#[cfg(target_family = "windows")]
pub use crate::windows::*;
pub trait LocalFrom<T>: Sized
{
#[must_use]
fn from(value: T) -> Self;
}
pub trait SockOptMarker
{
const SO_LEVEL: c_int;
const SO_OPTNAME: c_int;
type DataType;
type InputType;
fn from(value: Self::InputType) -> Self where Self: Sized;
fn from_user(value: Self::DataType) -> Self where Self: Sized;
fn get(self) -> Self::DataType;
}
pub trait OptRMarker {}
pub trait OptWMarker {}
#[cfg(target_family = "unix")]
pub trait AsOsDescr: AsFd + AsRawFd
{
fn borrowed(&self) -> BorrowedFd<'_>
{
self.as_fd()
}
fn raw(&self) -> RawFd
{
self.as_raw_fd()
}
}
#[cfg(target_family = "windows")]
pub trait AsOsDescr: AsSocket + AsRawSocket
{
fn borrowed(&self) -> BorrowedSocket<'_>
{
self.as_socket()
}
fn raw(&self) -> RawSocket
{
self.as_raw_socket()
}
}
#[derive(Debug)]
pub struct Dum;
pub trait Socket9ExtSo<T = Dum>: AsOsDescr + Sized
{
#[cfg(any(target_os = "freebsd"))]
#[inline]
fn get_so_label(&self) ->io::Result<<SoBroadcast as SockOptMarker>::DataType>
{
compile_error!("https://github.com/lattera/freebsd/blob/401a161083850a9a4ce916f37520c084cff1543b/sys/sys/socket.h#L142");
}
#[inline]
fn get_so_listening_status(&self) -> io::Result<<SoAcceptConn as SockOptMarker>::DataType>
{
return
getsockopt::<SoAcceptConn, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_family = "unix"))]
#[inline]
fn get_so_domain(&self) -> io::Result<<SoDomain as SockOptMarker>::DataType>
{
return
getsockopt::<SoDomain, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "windows"))]
#[inline]
fn get_so_domain(&self) -> io::Result<<SoProtocolInfoDomain as SockOptMarker>::DataType>
{
return
getsockopt::<SoProtocolInfoDomain, Self>(self)
.map(|v| v.get());
}
#[inline]
fn get_so_type(&self) -> io::Result<<SoType as SockOptMarker>::DataType>
{
return
getsockopt::<SoType, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
#[inline]
fn get_so_protocol(&self) -> io::Result<<SoProtocol as SockOptMarker>::DataType>
{
return
getsockopt::<SoProtocol, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "windows"))]
#[inline]
fn get_so_protocol(&self) -> io::Result<<SoProtocol as SockOptMarker>::DataType>
{
return
getsockopt::<SoProtocol, Self>(self)
.map(|v| v.get());
}
#[cfg(any(
target_os = "ios",
target_os = "visionos",
target_os = "macos",
target_os = "tvos",
target_os = "watchos",
target_os = "freebsd"
))]
#[inline]
fn get_so_nosigpipe(&self) -> io::Result<<SoNoSigPipe as SockOptMarker>::DataType>
{
return
getsockopt::<SoNoSigPipe, Self>(self)
.map(|v| v.get());
}
#[cfg(any(
target_os = "ios",
target_os = "visionos",
target_os = "macos",
target_os = "tvos",
target_os = "watchos",
))]
#[inline]
fn set_so_nosigpipe(&self, flag: <SoNoSigPipe as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoNoSigPipe, Self>(self, SoNoSigPipe::from_user(flag));
}
#[inline]
fn get_so_broadcast(&self) -> io::Result<<SoBroadcast as SockOptMarker>::DataType>
{
return
getsockopt::<SoBroadcast, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_broadcast(&self, flag: <SoBroadcast as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoBroadcast, Self>(self, SoBroadcast::from_user(flag));
}
#[inline]
fn get_so_error(&self) -> <SoError as SockOptMarker>::DataType
{
return
getsockopt::<SoError, Self>(self)
.map_or_else(
|e| Some(e),
|f| f.get()
);
}
#[inline]
fn get_so_keepalive(&self) -> io::Result<<SoKeepAlive as SockOptMarker>::DataType>
{
return
getsockopt::<SoKeepAlive, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_keepalive(&self, flag: <SoKeepAlive as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoKeepAlive, Self>(self, SoKeepAlive::from_user(flag));
}
#[inline]
fn get_so_linger(&self) -> io::Result<<SoLinger as SockOptMarker>::DataType>
{
return
getsockopt::<SoLinger, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_linger(&self, dur: <SoLinger as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoLinger, Self>(self, SoLinger::from_user(dur));
}
#[cfg(not(target_os = "redox"))]
#[inline]
fn get_so_out_of_band_inline(&self) -> io::Result<<SoOoBinLine as SockOptMarker>::DataType>
{
return
getsockopt::<SoOoBinLine, Self>(self)
.map(|v| v.get());
}
#[cfg(not(target_os = "redox"))]
#[inline]
fn set_so_out_of_band_inline(&self, flag: <SoOoBinLine as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoOoBinLine, Self>(self, SoOoBinLine::from_user(flag));
}
#[cfg(any(target_os = "linux"))]
#[inline]
fn get_so_passcred(&self) -> io::Result<<SoPasscred as SockOptMarker>::DataType>
{
return
getsockopt::<SoPasscred, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux"))]
#[inline]
fn set_so_passcred(&self, flag: <SoPasscred as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoPasscred, Self>(self, SoPasscred::from_user(flag));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_priority(&self) -> io::Result<<SoPriority as SockOptMarker>::DataType>
{
return
getsockopt::<SoPriority, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_priority(&self, prio: <SoPriority as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoPriority, Self>(self, SoPriority::from_user(prio));
}
#[inline]
fn get_so_recv_buf_size(&self) -> io::Result<<SoRcvBuf as SockOptMarker>::DataType>
{
return
getsockopt::<SoRcvBuf, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_recv_buf_size(&self, size: <SoRcvBuf as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoRcvBuf, Self>(self, SoRcvBuf::from_user(size));
}
#[cfg(unix)]
#[inline]
fn get_so_recv_min_output_count(&self) -> io::Result<<SoRcvLoWat as SockOptMarker>::DataType>
{
return
getsockopt::<SoRcvLoWat, Self>(self)
.map(|v| v.get());
}
#[inline]
fn get_so_recv_timeout(&self) -> io::Result<<SoRcvTimeout as SockOptMarker>::DataType>
{
return
getsockopt::<SoRcvTimeout, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_recv_timeout(&self, size: <SoRcvTimeout as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoRcvTimeout, Self>(self, SoRcvTimeout::from_user(size));
}
#[inline]
fn get_so_reuse_addr(&self) -> io::Result<<SoReuseAddr as SockOptMarker>::DataType>
{
return
getsockopt::<SoReuseAddr, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_reuse_addr(&self, flag: <SoReuseAddr as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoReuseAddr, Self>(self, SoReuseAddr::from_user(flag));
}
#[cfg(unix)]
#[inline]
fn get_so_reuse_port(&self) -> io::Result<<SoReusePort as SockOptMarker>::DataType>
{
return
getsockopt::<SoReusePort, Self>(self)
.map(|v| v.get());
}
#[cfg(unix)]
#[inline]
fn set_so_reuse_port(&self, flag: <SoReusePort as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoReusePort, Self>(self, SoReusePort::from_user(flag));
}
#[cfg(target_os = "freebsd")]
#[inline]
fn get_so_reuse_port_lb(&self) -> io::Result<<SoReusePortLb as SockOptMarker>::DataType>
{
return
getsockopt::<SoReusePortLb, Self>(self)
.map(|v| v.get());
}
#[cfg(target_os = "freebsd")]
#[inline]
fn set_so_reuse_port_lb(&self, flag: <SoReusePortLb as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoReusePortLb, Self>(self, SoReusePortLb::from_user(flag));
}
#[inline]
fn get_so_dont_route(&self) -> io::Result<<SoRDontRoute as SockOptMarker>::DataType>
{
return
getsockopt::<SoRDontRoute, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_dont_route(&self, flag: <SoRDontRoute as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoRDontRoute, Self>(self, SoRDontRoute::from_user(flag));
}
#[inline]
fn get_so_send_buf_size(&self) -> io::Result<<SoSndBuf as SockOptMarker>::DataType>
{
return
getsockopt::<SoSndBuf, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_send_buf_size(&self, sz: <SoSndBuf as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoSndBuf, Self>(self, SoSndBuf::from_user(sz));
}
#[cfg(unix)]
#[inline]
fn get_so_send_output_min_count(&self) -> io::Result<<SoSndLoWat as SockOptMarker>::DataType>
{
return
getsockopt::<SoSndLoWat, Self>(self)
.map(|v| v.get());
}
#[cfg(unix)]
#[inline]
fn set_so_send_output_min_count(&self, sz: <SoSndLoWat as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoSndLoWat, Self>(self, SoSndLoWat::from_user(sz));
}
#[inline]
fn get_so_send_timeout(&self) -> io::Result<<SoSndTimeout as SockOptMarker>::DataType>
{
return
getsockopt::<SoSndTimeout, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_so_send_timeout(&self, size: <SoSndTimeout as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoSndTimeout, Self>(self, SoSndTimeout::from_user(size));
}
#[cfg(any(target_os = "linux"))]
#[inline]
fn get_so_cpu_affinity(&self) -> io::Result<<SoCpuAffinity as SockOptMarker>::DataType>
{
return
getsockopt::<SoCpuAffinity, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux"))]
#[inline]
fn set_so_cpu_affinity(&self, size: <SoCpuAffinity as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoCpuAffinity, Self>(self, SoCpuAffinity::from_user(size));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_incoming_napi_id(&self) -> io::Result<<SoIncomingNapiId as SockOptMarker>::DataType>
{
return
getsockopt::<SoIncomingNapiId, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_mark(&self) -> io::Result<<SoMark as SockOptMarker>::DataType>
{
return
getsockopt::<SoMark, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_mark(&self, mark: <SoMark as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoMark, Self>(self, SoMark::from_user(mark));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_busy_poll(&self) -> io::Result<<SoBusyPoll as SockOptMarker>::DataType>
{
return
getsockopt::<SoBusyPoll, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_busy_poll(&self, bp: <SoBusyPoll as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoBusyPoll, Self>(self, SoBusyPoll::from_user(bp));
}
#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "android"))]
#[inline]
fn get_so_timestamp(&self) -> io::Result<<SoTimestamp as SockOptMarker>::DataType>
{
return
getsockopt::<SoTimestamp, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "android"))]
#[inline]
fn set_so_timestamp(&self, tm: <SoTimestamp as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoTimestamp, Self>(self, SoTimestamp::from_user(tm));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_timestamp_ns(&self) -> io::Result<<SoTimestampNs as SockOptMarker>::DataType>
{
return
getsockopt::<SoTimestampNs, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_timestamp_ns(&self, tm: <SoTimestampNs as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoTimestampNs, Self>(self, SoTimestampNs::from_user(tm));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_snd_buf_force(&self) -> io::Result<<SoSndBufForce as SockOptMarker>::DataType>
{
return
getsockopt::<SoSndBufForce, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_snd_buf_force(&self, size: <SoSndBufForce as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoSndBufForce, Self>(self, SoSndBufForce::from_user(size));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_select_err_queue(&self) -> io::Result<<SoSelectErrQue as SockOptMarker>::DataType>
{
return
getsockopt::<SoSelectErrQue, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_select_err_queue(&self, flag: <SoSelectErrQue as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoSelectErrQue, Self>(self, SoSelectErrQue::from_user(flag));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_rxq_ovfl(&self) -> io::Result<<SoRqxOvfl as SockOptMarker>::DataType>
{
return
getsockopt::<SoRqxOvfl, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_rxq_ovfl(&self, flag: <SoRqxOvfl as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoRqxOvfl, Self>(self, SoRqxOvfl::from_user(flag));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_peercred(&self) -> io::Result<<SoPeercred as SockOptMarker>::DataType>
{
return
getsockopt::<SoPeercred, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_peersec(&self) -> io::Result<<SoPeersec as SockOptMarker>::DataType>
{
return
getsockopt::<SoPeersec, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_passsec(&self) -> io::Result<<SoPassec as SockOptMarker>::DataType>
{
return
getsockopt::<SoPassec, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_passsec(&self, flag: <SoPassec as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoPassec, Self>(self, SoPassec::from_user(flag));
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn get_so_peek_off(&self) -> io::Result<<SoPeekOff as SockOptMarker>::DataType>
{
return
getsockopt::<SoPeekOff, Self>(self)
.map(|v| v.get());
}
#[cfg(any(target_os = "linux", target_os = "android"))]
#[inline]
fn set_so_peek_off(&self, offset: <SoPeekOff as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<SoPeekOff, Self>(self, SoPeekOff::from_user(offset));
}
}
pub trait Socket9ExtSoIp<T = Dum>: AsOsDescr + Sized
{
#[cfg(any(target_os = "android", target_os = "linux", target_os = "windows"))]
#[inline]
fn get_so_ip6_original_dst(&self) -> <SoIp6OriginalDst as SockOptMarker>::DataType
{
return
getsockopt::<SoIp6OriginalDst, Self>(self)
.map_or_else(
|e| Err(e),
|f| f.get()
);
}
}
pub trait Socket9ExtSoIp6<T = Dum>: AsOsDescr + Sized
{
#[inline]
fn get_so_ip_original_dst(&self) -> <SoIpOriginalDst as SockOptMarker>::DataType
{
return
getsockopt::<SoIpOriginalDst, Self>(self)
.map_or_else(
|e| Err(e),
|f| f.get()
);
}
}
pub trait Socket9ExtIpRaw<T = Dum>: AsOsDescr + Sized
{
#[cfg(not(any(target_os = "redox")))]
#[inline]
fn get_ip_header_included(&self) -> io::Result<<IpHdrincl as SockOptMarker>::DataType>
{
return
getsockopt::<IpHdrincl, Self>(self)
.map(|v| v.get());
}
#[cfg(not(any(target_os = "redox")))]
#[inline]
fn set_ip_header_included(&self, flag: <IpHdrincl as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpHdrincl, Self>(self, IpHdrincl::from_user(flag));
}
}
pub trait Socket9ExtIp6Raw<T = Dum>: AsOsDescr + Sized
{
#[cfg(not(any(target_os = "redox")))]
#[inline]
fn get_ip6_header_included(&self) -> io::Result<<Ip6Hdrincl as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6Hdrincl, Self>(self)
.map(|v| v.get());
}
#[cfg(not(any(target_os = "redox")))]
#[inline]
fn set_ip6_header_included(&self, flag: <Ip6Hdrincl as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6Hdrincl, Self>(self, Ip6Hdrincl::from_user(flag));
}
}
pub trait Socket9ExtIp<T = Dum>: AsOsDescr + Sized
{
#[cfg(any(
target_os = "android",
target_os = "linux"
))]
fn get_ip_tcp_thin_linear_timeouts(&self) -> io::Result<<IpProtoTcpThinLinearTimeouts as SockOptMarker>::DataType>
{
return
getsockopt::<IpProtoTcpThinLinearTimeouts, Self>(self)
.map(|v| v.get());
}
#[cfg(any(
target_os = "android",
target_os = "linux"
))]
#[inline]
fn set_ip_tcp_thin_linear_timeouts(&self, flag: <IpProtoTcpThinLinearTimeouts as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpProtoTcpThinLinearTimeouts, Self>(self, IpProtoTcpThinLinearTimeouts::from_user(flag));
}
#[cfg(any(
target_os = "android",
target_os = "linux"
))]
fn get_ip_tcp_notsent_lowat(&self) -> io::Result<<IpProtoNotsentLowat as SockOptMarker>::DataType>
{
return
getsockopt::<IpProtoNotsentLowat, Self>(self)
.map(|v| v.get());
}
#[cfg(any(
target_os = "android",
target_os = "linux"
))]
#[inline]
fn set_ip_tcp_notsent_lowat(&self, flag: <IpProtoNotsentLowat as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpProtoNotsentLowat, Self>(self, IpProtoNotsentLowat::from_user(flag));
}
#[cfg(target_os = "linux")]
#[inline]
fn get_ip_transparent(&self) -> io::Result<<IpTransparent as SockOptMarker>::DataType>
{
return
getsockopt::<IpTransparent, Self>(self)
.map(|v| v.get());
}
#[cfg(target_os = "linux")]
#[inline]
fn set_ip_transparent(&self, flag: <IpTransparent as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpTransparent, Self>(self, IpTransparent::from_user(flag));
}
#[cfg(not(any(
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
)))]
#[inline]
fn ip_join_multicast(&self, multiaddr: Ipv4Addr, interface: So9IfInder) -> io::Result<()>
{
return
setsockopt
::<IpAddMembership, Self>(self, IpAddMembership::from_user((multiaddr, interface)));
}
#[cfg(not(any(
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
)))]
#[inline]
fn ip_leave_multicast(&self, multiaddr: Ipv4Addr, interface: So9IfInder) -> io::Result<()>
{
return
setsockopt
::<IpDropMembership, Self>(self, IpDropMembership::from_user((multiaddr, interface)));
}
#[cfg(not(any(target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd", target_os = "redox")))]
#[inline]
fn ip_join_ssm(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr, source: Ipv4Addr) -> io::Result<()>
{
return
setsockopt
::<IpAddSourceMembership, Self>(self,
IpAddSourceMembership::from_user((multiaddr, interface, source))
);
}
#[cfg(not(any(target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd", target_os = "redox")))]
#[inline]
fn ip_leave_ssm(&self, multiaddr: Ipv4Addr, interface: Ipv4Addr, source: Ipv4Addr) -> io::Result<()>
{
return
setsockopt
::<IpDropSourceMembership, Self>(self,
IpDropSourceMembership::from_user((multiaddr, interface, source))
);
}
#[cfg(target_os = "linux")]
#[inline]
fn get_ip_multicast_all(&self) -> io::Result<<IpMulticastAll as SockOptMarker>::DataType>
{
return
getsockopt::<IpMulticastAll, Self>(self)
.map(|v| v.get());
}
#[cfg(target_os = "linux")]
#[inline]
fn set_ip_multicast_all(&self, flag: <IpMulticastAll as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpMulticastAll, Self>(self, IpMulticastAll::from_user(flag));
}
#[inline]
fn get_ip_multicast_if(&self) -> io::Result<<IpMulticastIf as SockOptMarker>::DataType>
{
return
getsockopt::<IpMulticastIf, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip_multicast_if(&self, intf: <IpMulticastIf as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpMulticastIf, Self>(self, IpMulticastIf::from_user(intf));
}
#[inline]
fn get_ip_multicast_loop(&self) -> io::Result<<IpMulticastLoop as SockOptMarker>::DataType>
{
return
getsockopt::<IpMulticastLoop, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip_multicast_loop(&self, intf: <IpMulticastLoop as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpMulticastLoop, Self>(self, IpMulticastLoop::from_user(intf));
}
#[inline]
fn get_ip_multicast_ttl(&self) -> io::Result<<IpMulticastTtl as SockOptMarker>::DataType>
{
return
getsockopt::<IpMulticastTtl, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip_multicast_ttl(&self, ttl: <IpMulticastTtl as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpMulticastTtl, Self>(self, IpMulticastTtl::from_user(ttl));
}
#[inline]
fn get_ip_ttl(&self) -> io::Result<<IpTtl as SockOptMarker>::DataType>
{
return
getsockopt::<IpTtl, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip_ttl(&self, ttl: <IpTtl as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpTtl, Self>(self, IpTtl::from_user(ttl));
}
#[cfg(not(any(target_os = "redox", target_os = "solaris")))]
#[inline]
fn get_ip_tos(&self) -> io::Result<<IpTos as SockOptMarker>::DataType>
{
return
getsockopt::<IpTos, Self>(self)
.map(|v| v.get());
}
#[cfg(not(any(target_os = "redox", target_os = "solaris")))]
#[inline]
fn set_ip_tos(&self, tos: <IpTos as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpTos, Self>(self, IpTos::from_user(tos));
}
#[cfg(not(any(target_os = "netbsd", target_os = "dragonfly", target_os = "openbsd", target_os = "redox", target_os = "solaris")))]
#[inline]
fn get_ip_recv_tos(&self) -> io::Result<<IpRecvTos as SockOptMarker>::DataType>
{
return
getsockopt::<IpRecvTos, Self>(self)
.map(|v| v.get());
}
#[cfg(not(any(target_os = "netbsd", target_os = "dragonfly", target_os = "openbsd", target_os = "redox", target_os = "solaris")))]
#[inline]
fn set_ip_recv_tos(&self, tos: <IpRecvTos as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpRecvTos, Self>(self, IpRecvTos::from_user(tos));
}
}
pub trait Socket9ExtIp6<T = Dum>: AsOsDescr + Sized
{
#[inline]
fn ip6_join_multicast(&self, mu_addr: Ipv6Addr, intrf: u32) -> io::Result<()>
{
return
setsockopt
::<Ip6AddMembership, Self>(self, Ip6AddMembership::from_user((mu_addr, intrf)));
}
#[inline]
fn ip6_leave_multicast(&self, mu_addr: Ipv6Addr, intrf: u32) -> io::Result<()>
{
return
setsockopt
::<Ip6DropMembership, Self>(self, Ip6DropMembership::from_user((mu_addr, intrf)));
}
#[inline]
fn get_ip6_multicast_hops(&self) -> io::Result<<Ip6MulticastHops as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6MulticastHops, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip6_multicast_hops(&self, hops: <Ip6MulticastHops as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6MulticastHops, Self>(self, Ip6MulticastHops::from_user(hops));
}
#[cfg(target_os = "linux")]
#[inline]
fn get_ip6_multicast_all(&self) -> io::Result<<Ip6MulticastAll as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6MulticastAll, Self>(self)
.map(|v| v.get());
}
#[cfg(target_os = "linux")]
#[inline]
fn set_ip6_multicast_all(&self, flag: <Ip6MulticastAll as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6MulticastAll, Self>(self, Ip6MulticastAll::from_user(flag));
}
#[inline]
fn get_ip6_multicast_if(&self) -> io::Result<<Ip6MulticastIf as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6MulticastIf, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip6_multicast_if(&self, flag: <Ip6MulticastIf as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6MulticastIf, Self>(self, Ip6MulticastIf::from_user(flag));
}
#[inline]
fn get_ip6_multicast_loop(&self) -> io::Result<<Ip6MulticastLoop as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6MulticastLoop, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip6_multicast_loop(&self, flag: <Ip6MulticastLoop as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6MulticastLoop, Self>(self, Ip6MulticastLoop::from_user(flag));
}
#[inline]
fn get_ip6_unicast_hops(&self) -> io::Result<<Ip6UnicastHops as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6UnicastHops, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip6_unicast_hops(&self, hops: <Ip6UnicastHops as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6UnicastHops, Self>(self, Ip6UnicastHops::from_user(hops));
}
#[inline]
fn get_ip6_only(&self) -> io::Result<<Ip6V6Only as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6V6Only, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_ip6_only(&self, flag: <Ip6V6Only as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6V6Only, Self>(self, Ip6V6Only::from_user(flag));
}
#[cfg(not(any(
target_os = "dragonfly",
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris"
)))]
#[inline]
fn get_ip6_recv_tclass(&self) -> io::Result<<Ip6RecvTclass as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6RecvTclass, Self>(self)
.map(|v| v.get());
}
#[cfg(not(any(
target_os = "dragonfly",
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris"
)))]
#[inline]
fn set_ip6_recv_tclass(&self, flag: <Ip6RecvTclass as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6RecvTclass, Self>(self, Ip6RecvTclass::from_user(flag));
}
#[cfg(
not(any(
windows,
target_os = "dragonfly",
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris",
))
)]
#[inline]
fn get_ip6_recv_hoplimit(&self) -> io::Result<<Ip6RecvHopLimit as SockOptMarker>::DataType>
{
return
getsockopt::<Ip6RecvHopLimit, Self>(self)
.map(|v| v.get());
}
#[cfg(
not(any(
windows,
target_os = "dragonfly",
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris",
))
)]
#[inline]
fn set_ip6_recv_hoplimit(&self, hop_lim: <Ip6RecvHopLimit as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<Ip6RecvHopLimit, Self>(self, Ip6RecvHopLimit::from_user(hop_lim));
}
}
pub trait Socket9ExtIpTcpExt<T = Dum>: AsOsDescr + Sized + Socket9ExtSo<T>
{
#[inline]
fn set_tcp_keepalive(&self, time_idle: Option<Duration>, time_interval: Option<Duration>, retries: Option<u32>) -> io::Result<()>
{
self.set_so_keepalive(true)?;
#[cfg(not(any(target_os = "openbsd")))]
if let Some(ti) = time_idle
{
setsockopt::<IpProtoKeepIdleAliveW, Self>(self, IpProtoKeepIdleAliveW::from_user(ti))?;
}
#[cfg(any(
target_os = "ios",
target_os = "android",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "linux",
target_os = "macos",
target_os = "netbsd",
target_os = "tvos",
))]
if let Some(ti) = time_interval
{
setsockopt::<IpProtoKeepIntvl, Self>(self, IpProtoKeepIntvl::from_user(ti))?;
}
#[cfg(any(
target_os = "ios",
target_os = "android",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "linux",
target_os = "macos",
target_os = "netbsd",
target_os = "tvos",
))]
if let Some(retr) = retries
{
setsockopt::<IpProtoKeepCnt, Self>(self, IpProtoKeepCnt::from_user(retr))?;
}
return Ok(());
}
}
pub trait Socket9ExtIpTcp<T = Dum>: AsOsDescr + Sized
{
#[cfg(not(target_os = "openbsd"))]
#[inline]
fn get_tcp_keepalive_time(&self) -> io::Result<<IpProtoKeepIdleAliveR as SockOptMarker>::DataType>
{
return
getsockopt::<IpProtoKeepIdleAliveR, Self>(self)
.map(|v| v.get());
}
#[cfg(any(
target_os = "ios",
target_os = "android",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "linux",
target_os = "macos",
target_os = "netbsd",
target_os = "tvos",
))]
#[inline]
fn get_tcp_keepalive_interval(&self) -> io::Result<<IpProtoKeepIntvl as SockOptMarker>::DataType>
{
return
getsockopt::<IpProtoKeepIntvl, Self>(self)
.map(|v| v.get());
}
#[cfg(any(
target_os = "ios",
target_os = "android",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "linux",
target_os = "macos",
target_os = "netbsd",
target_os = "tvos",
))]
#[inline]
fn get_tcp_keepalive_retries(&self) -> io::Result<<IpProtoKeepCnt as SockOptMarker>::DataType>
{
return
getsockopt::<IpProtoKeepCnt, Self>(self)
.map(|v| v.get());
}
#[inline]
fn get_tcp_nodelay(&self) -> io::Result<<IpProtoNodelay as SockOptMarker>::DataType>
{
return
getsockopt::<IpProtoNodelay, Self>(self)
.map(|v| v.get());
}
#[inline]
fn set_tcp_nodelay(&self, flag: <IpProtoNodelay as SockOptMarker>::DataType) -> io::Result<()>
{
return
setsockopt::<IpProtoNodelay, Self>(self, IpProtoNodelay::from_user(flag));
}
}
#[cfg(target_family = "unix")]
mod unix_os
{
use super::*;
impl AsOsDescr for OwnedFd {}
impl AsOsDescr for TcpListener {}
impl AsOsDescr for UdpSocket {}
impl AsOsDescr for TcpStream {}
impl AsOsDescr for UnixDatagram {}
impl AsOsDescr for UnixStream {}
impl AsOsDescr for UnixSeqpacketConn {}
impl AsOsDescr for UnixSeqpacketListener {}
impl Socket9ExtSo for UnixDatagram {}
impl Socket9ExtSo for UnixStream {}
impl Socket9ExtSo for UnixSeqpacketConn {}
impl Socket9ExtSo for UnixSeqpacketListener {}
}
#[cfg(target_family = "windows")]
mod windows_os
{
use std::os::windows::io::OwnedSocket;
use super::*;
impl AsOsDescr for OwnedSocket {}
impl AsOsDescr for TcpListener {}
impl AsOsDescr for UdpSocket {}
impl AsOsDescr for TcpStream {}
}
impl Socket9ExtSo for TcpListener {}
impl Socket9ExtSo for UdpSocket {}
impl Socket9ExtSo for TcpStream {}
impl Socket9ExtSoIp for TcpListener {}
impl Socket9ExtSoIp6 for TcpListener {}
impl Socket9ExtIp for TcpListener{}
impl Socket9ExtIp for UdpSocket {}
impl Socket9ExtIp for TcpStream {}
impl Socket9ExtIp6 for TcpListener{}
impl Socket9ExtIp6 for UdpSocket {}
impl Socket9ExtIp6 for TcpStream {}
impl Socket9ExtIpTcp for TcpStream{}
impl Socket9ExtIpTcpExt for TcpStream {}