Line data Source code
1 : //! Linux-specific socket ioctls.
2 : //!
3 : //! <https://elixir.bootlin.com/linux/v6.1.128/source/include/uapi/linux/sockios.h#L25-L27>
4 :
5 : use std::io;
6 : use std::mem::MaybeUninit;
7 : use std::os::fd::RawFd;
8 : use std::os::raw::c_int;
9 :
10 : use nix::libc::{FIONREAD, TIOCOUTQ};
11 :
12 0 : unsafe fn do_ioctl(socket_fd: RawFd, cmd: nix::libc::Ioctl) -> io::Result<c_int> {
13 0 : let mut inq: MaybeUninit<c_int> = MaybeUninit::uninit();
14 0 : // SAFETY: encapsulating fn is unsafe, we require `socket_fd` to be a valid file descriptor
15 0 : unsafe {
16 0 : let err = nix::libc::ioctl(socket_fd, cmd, inq.as_mut_ptr());
17 0 : if err == 0 {
18 0 : Ok(inq.assume_init())
19 : } else {
20 0 : Err(io::Error::last_os_error())
21 : }
22 : }
23 0 : }
24 :
25 : /// # Safety
26 : ///
27 : /// Caller must ensure that `socket_fd` is a valid TCP socket file descriptor.
28 0 : pub unsafe fn inq(socket_fd: RawFd) -> io::Result<c_int> {
29 0 : // SAFETY: encapsulating fn is unsafe
30 0 : unsafe { do_ioctl(socket_fd, FIONREAD) }
31 0 : }
32 :
33 : /// # Safety
34 : ///
35 : /// Caller must ensure that `socket_fd` is a valid TCP socket file descriptor.
36 0 : pub unsafe fn outq(socket_fd: RawFd) -> io::Result<c_int> {
37 0 : // SAFETY: encapsulating fn is unsafe
38 0 : unsafe { do_ioctl(socket_fd, TIOCOUTQ) }
39 0 : }
|