//! `getsockopt` and `setsockopt` functions. //! //! In the rustix API, there is a separate function for each option, so that //! it can be given an option-specific type signature. #![doc(alias = "getsockopt")] #![doc(alias = "setsockopt")] use crate::net::{Ipv4Addr, Ipv6Addr, SocketType}; use crate::{backend, io}; use backend::fd::AsFd; use core::time::Duration; pub use backend::net::types::Timeout; /// `getsockopt(fd, SOL_SOCKET, SO_TYPE)`—Returns the type of a socket. /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `getsockopt`] /// - [Linux `socket`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_TYPE")] pub fn get_socket_type(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_socket_type(fd.as_fd()) } /// `setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, value)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `setsockopt`] /// - [Linux `socket`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_REUSEADDR")] pub fn set_socket_reuseaddr(fd: Fd, value: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_socket_reuseaddr(fd.as_fd(), value) } /// `setsockopt(fd, SOL_SOCKET, SO_BROADCAST, broadcast)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `setsockopt`] /// - [Linux `socket`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_BROADCAST")] pub fn set_socket_broadcast(fd: Fd, broadcast: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_socket_broadcast(fd.as_fd(), broadcast) } /// `getsockopt(fd, SOL_SOCKET, SO_BROADCAST)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `getsockopt`] /// - [Linux `socket`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_BROADCAST")] pub fn get_socket_broadcast(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_socket_broadcast(fd.as_fd()) } /// `setsockopt(fd, SOL_SOCKET, SO_LINGER, linger)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `setsockopt`] /// - [Linux `socket`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_LINGER")] pub fn set_socket_linger(fd: Fd, linger: Option) -> io::Result<()> { backend::net::syscalls::sockopt::set_socket_linger(fd.as_fd(), linger) } /// `getsockopt(fd, SOL_SOCKET, SO_LINGER)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `getsockopt`] /// - [Linux `socket`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_LINGER")] pub fn get_socket_linger(fd: Fd) -> io::Result> { backend::net::syscalls::sockopt::get_socket_linger(fd.as_fd()) } /// `setsockopt(fd, SOL_SOCKET, SO_PASSCRED, passcred)` /// /// # References /// - [Linux `setsockopt`] /// - [Linux `socket`] /// /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html #[cfg(any(target_os = "android", target_os = "linux"))] #[inline] #[doc(alias = "SO_PASSCRED")] pub fn set_socket_passcred(fd: Fd, passcred: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_socket_passcred(fd.as_fd(), passcred) } /// `getsockopt(fd, SOL_SOCKET, SO_PASSCRED)` /// /// # References /// - [Linux `getsockopt`] /// - [Linux `socket`] /// /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html #[cfg(any(target_os = "android", target_os = "linux"))] #[inline] #[doc(alias = "SO_PASSCRED")] pub fn get_socket_passcred(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_socket_passcred(fd.as_fd()) } /// `setsockopt(fd, SOL_SOCKET, id, timeout)`—Set the sending /// or receiving timeout. /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `setsockopt`] /// - [Linux `socket`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_RCVTIMEO")] #[doc(alias = "SO_SNDTIMEO")] pub fn set_socket_timeout( fd: Fd, id: Timeout, timeout: Option, ) -> io::Result<()> { backend::net::syscalls::sockopt::set_socket_timeout(fd.as_fd(), id, timeout) } /// `getsockopt(fd, SOL_SOCKET, id)`—Get the sending or receiving timeout. /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `getsockopt`] /// - [Linux `socket`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_RCVTIMEO")] #[doc(alias = "SO_SNDTIMEO")] pub fn get_socket_timeout(fd: Fd, id: Timeout) -> io::Result> { backend::net::syscalls::sockopt::get_socket_timeout(fd.as_fd(), id) } /// `getsockopt(fd, SOL_SOCKET, SO_ERROR)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `sys/socket.h`] /// - [Linux `getsockopt`] /// - [Linux `socket`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `SOL_SOCKET` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `sys/socket.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `socket`]: https://man7.org/linux/man-pages/man7/socket.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `SOL_SOCKET` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options #[inline] #[doc(alias = "SO_ERROR")] pub fn get_socket_error(fd: Fd) -> io::Result> { backend::net::syscalls::sockopt::get_socket_error(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IP, IP_TTL, ttl)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ip`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IP` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_TTL")] pub fn set_ip_ttl(fd: Fd, ttl: u32) -> io::Result<()> { backend::net::syscalls::sockopt::set_ip_ttl(fd.as_fd(), ttl) } /// `getsockopt(fd, IPPROTO_IP, IP_TTL)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `getsockopt`] /// - [Linux `ip`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_TTL")] pub fn get_ip_ttl(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_ip_ttl(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, only_v6)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ipv6`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IPV6_V6ONLY")] pub fn set_ipv6_v6only(fd: Fd, only_v6: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_ipv6_v6only(fd.as_fd(), only_v6) } /// `getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `getsockopt`] /// - [Linux `ipv6`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IPV6_V6ONLY")] pub fn get_ipv6_v6only(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_ipv6_v6only(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, multicast_loop)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ip`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IP` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_MULTICAST_LOOP")] pub fn set_ip_multicast_loop(fd: Fd, multicast_loop: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_ip_multicast_loop(fd.as_fd(), multicast_loop) } /// `getsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `getsockopt`] /// - [Linux `ip`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_IP` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_MULTICAST_LOOP")] pub fn get_ip_multicast_loop(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_ip_multicast_loop(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, multicast_ttl)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ip`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IP` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_MULTICAST_TTL")] pub fn set_ip_multicast_ttl(fd: Fd, multicast_ttl: u32) -> io::Result<()> { backend::net::syscalls::sockopt::set_ip_multicast_ttl(fd.as_fd(), multicast_ttl) } /// `getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `getsockopt`] /// - [Linux `ip`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_IP` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_MULTICAST_TTL")] pub fn get_ip_multicast_ttl(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_ip_multicast_ttl(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, multicast_loop)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ipv6`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IPV6_MULTICAST_LOOP")] pub fn set_ipv6_multicast_loop(fd: Fd, multicast_loop: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_ipv6_multicast_loop(fd.as_fd(), multicast_loop) } /// `getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `getsockopt`] /// - [Linux `ipv6`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IPV6_MULTICAST_LOOP")] pub fn get_ipv6_multicast_loop(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_ipv6_multicast_loop(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IP, IPV6_MULTICAST_HOPS, multicast_hops)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ipv6`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IP_MULTICAST_TTL")] pub fn set_ipv6_multicast_hops(fd: Fd, multicast_hops: u32) -> io::Result<()> { backend::net::syscalls::sockopt::set_ipv6_multicast_hops(fd.as_fd(), multicast_hops) } /// `getsockopt(fd, IPPROTO_IP, IPV6_MULTICAST_HOPS)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `getsockopt`] /// - [Linux `ipv6`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `getsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IP_MULTICAST_TTL")] pub fn get_ipv6_multicast_hops(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_ipv6_multicast_hops(fd.as_fd()) } /// `setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, multiaddr, interface)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ip`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IP` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_ADD_MEMBERSHIP")] pub fn set_ip_add_membership( fd: Fd, multiaddr: &Ipv4Addr, interface: &Ipv4Addr, ) -> io::Result<()> { backend::net::syscalls::sockopt::set_ip_add_membership(fd.as_fd(), multiaddr, interface) } /// `setsockopt(fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, multiaddr, interface)` /// /// `IPV6_ADD_MEMBERSHIP` is the same as `IPV6_JOIN_GROUP` in POSIX. /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ipv6] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IPV6_JOIN_GROUP")] #[doc(alias = "IPV6_ADD_MEMBERSHIP")] pub fn set_ipv6_add_membership( fd: Fd, multiaddr: &Ipv6Addr, interface: u32, ) -> io::Result<()> { backend::net::syscalls::sockopt::set_ipv6_add_membership(fd.as_fd(), multiaddr, interface) } /// `setsockopt(fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, multiaddr, interface)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ip`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IP` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ip`]: https://man7.org/linux/man-pages/man7/ip.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ip-socket-options #[inline] #[doc(alias = "IP_DROP_MEMBERSHIP")] pub fn set_ip_drop_membership( fd: Fd, multiaddr: &Ipv4Addr, interface: &Ipv4Addr, ) -> io::Result<()> { backend::net::syscalls::sockopt::set_ip_drop_membership(fd.as_fd(), multiaddr, interface) } /// `setsockopt(fd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, multiaddr, interface)` /// /// `IPV6_DROP_MEMBERSHIP` is the same as `IPV6_LEAVE_GROUP` in POSIX. /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/in.h`] /// - [Linux `setsockopt`] /// - [Linux `ipv6`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_IPV6` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/in.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `ipv6`]: https://man7.org/linux/man-pages/man7/ipv6.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_IPV6` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-ipv6-socket-options #[inline] #[doc(alias = "IPV6_LEAVE_GROUP")] #[doc(alias = "IPV6_DROP_MEMBERSHIP")] pub fn set_ipv6_drop_membership( fd: Fd, multiaddr: &Ipv6Addr, interface: u32, ) -> io::Result<()> { backend::net::syscalls::sockopt::set_ipv6_drop_membership(fd.as_fd(), multiaddr, interface) } /// `setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, nodelay)` /// /// # References /// - [POSIX `setsockopt`] /// - [POSIX `netinet/tcp.h`] /// - [Linux `setsockopt`] /// - [Linux `tcp`] /// - [Winsock2 `setsockopt`] /// - [Winsock2 `IPPROTO_TCP` options] /// /// [POSIX `setsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html /// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html /// [Linux `setsockopt`]: https://man7.org/linux/man-pages/man2/setsockopt.2.html /// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options #[inline] #[doc(alias = "TCP_NODELAY")] pub fn set_tcp_nodelay(fd: Fd, nodelay: bool) -> io::Result<()> { backend::net::syscalls::sockopt::set_tcp_nodelay(fd.as_fd(), nodelay) } /// `getsockopt(fd, IPPROTO_TCP, TCP_NODELAY)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/tcp.h`] /// - [Linux `getsockopt`] /// - [Linux `tcp`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_TCP` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options #[inline] #[doc(alias = "TCP_NODELAY")] pub fn get_tcp_nodelay(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::get_tcp_nodelay(fd.as_fd()) } /// `getsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/tcp.h`] /// - [Linux `getsockopt`] /// - [Linux `tcp`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_TCP` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options #[cfg(any(apple, target_os = "freebsd"))] #[doc(alias = "SO_NOSIGPIPE")] #[inline] pub fn getsockopt_nosigpipe(fd: Fd) -> io::Result { backend::net::syscalls::sockopt::getsockopt_nosigpipe(fd.as_fd()) } /// `setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, val)` /// /// # References /// - [POSIX `getsockopt`] /// - [POSIX `netinet/tcp.h`] /// - [Linux `getsockopt`] /// - [Linux `tcp`] /// - [Winsock2 `getsockopt`] /// - [Winsock2 `IPPROTO_TCP` options] /// /// [POSIX `getsockopt`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html /// [POSIX `netinet/tcp.h`]: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_tcp.h.html /// [Linux `getsockopt`]: https://man7.org/linux/man-pages/man2/getsockopt.2.html /// [Linux `tcp`]: https://man7.org/linux/man-pages/man7/tcp.7.html /// [Winsock2 `setsockopt`]: https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt /// [Winsock2 `IPPROTO_TCP` options]: https://docs.microsoft.com/en-us/windows/win32/winsock/ipproto-tcp-socket-options #[cfg(any(apple, target_os = "freebsd"))] #[doc(alias = "SO_NOSIGPIPE")] #[inline] pub fn setsockopt_nosigpipe(fd: Fd, val: bool) -> io::Result<()> { backend::net::syscalls::sockopt::setsockopt_nosigpipe(fd.as_fd(), val) }