//! Linux-specific socket ioctls. //! //! use std::io; use std::mem::MaybeUninit; use std::os::fd::RawFd; use std::os::raw::c_int; use nix::libc::{FIONREAD, TIOCOUTQ}; unsafe fn do_ioctl(socket_fd: RawFd, cmd: nix::libc::Ioctl) -> io::Result { let mut inq: MaybeUninit = MaybeUninit::uninit(); // SAFETY: encapsulating fn is unsafe, we require `socket_fd` to be a valid file descriptor unsafe { let err = nix::libc::ioctl(socket_fd, cmd, inq.as_mut_ptr()); if err == 0 { Ok(inq.assume_init()) } else { Err(io::Error::last_os_error()) } } } /// # Safety /// /// Caller must ensure that `socket_fd` is a valid TCP socket file descriptor. pub unsafe fn inq(socket_fd: RawFd) -> io::Result { // SAFETY: encapsulating fn is unsafe unsafe { do_ioctl(socket_fd, FIONREAD) } } /// # Safety /// /// Caller must ensure that `socket_fd` is a valid TCP socket file descriptor. pub unsafe fn outq(socket_fd: RawFd) -> io::Result { // SAFETY: encapsulating fn is unsafe unsafe { do_ioctl(socket_fd, TIOCOUTQ) } }