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::{
6 : io,
7 : mem::MaybeUninit,
8 : os::{fd::RawFd, raw::c_int},
9 : };
10 :
11 : use nix::libc::{FIONREAD, TIOCOUTQ};
12 :
13 0 : unsafe fn do_ioctl(socket_fd: RawFd, cmd: nix::libc::Ioctl) -> io::Result<c_int> {
14 0 : let mut inq: MaybeUninit<c_int> = MaybeUninit::uninit();
15 0 : let err = nix::libc::ioctl(socket_fd, cmd, inq.as_mut_ptr());
16 0 : if err == 0 {
17 0 : Ok(inq.assume_init())
18 : } else {
19 0 : Err(io::Error::last_os_error())
20 : }
21 0 : }
22 :
23 : /// # Safety
24 : ///
25 : /// Caller must ensure that `socket_fd` is a valid TCP socket file descriptor.
26 0 : pub unsafe fn inq(socket_fd: RawFd) -> io::Result<c_int> {
27 0 : do_ioctl(socket_fd, FIONREAD)
28 0 : }
29 :
30 : /// # Safety
31 : ///
32 : /// Caller must ensure that `socket_fd` is a valid TCP socket file descriptor.
33 0 : pub unsafe fn outq(socket_fd: RawFd) -> io::Result<c_int> {
34 0 : do_ioctl(socket_fd, TIOCOUTQ)
35 0 : }
|