Skip to main content

dope_sys/io/socket/option/
source.rs

1use std::os::fd;
2
3use crate::{
4    Errno,
5    io::{
6        socket,
7        socket::option::{Kind, Level, Name, Value},
8    },
9};
10
11/// Native ABI selection for the same validated scalar options.
12pub trait Source: socket::Socket {
13    const KEEP_IDLE: Name;
14
15    fn option(kind: Kind) -> (Level, Name) {
16        match kind {
17            Kind::NoDelay => (Level::new(libc::IPPROTO_TCP), Name::new(libc::TCP_NODELAY)),
18            Kind::KeepAlive => (Level::new(libc::SOL_SOCKET), Name::new(libc::SO_KEEPALIVE)),
19            Kind::RecvBuffer => (Level::new(libc::SOL_SOCKET), Name::new(libc::SO_RCVBUF)),
20            Kind::SendBuffer => (Level::new(libc::SOL_SOCKET), Name::new(libc::SO_SNDBUF)),
21            Kind::KeepAliveIdle => (Level::new(libc::IPPROTO_TCP), Self::KEEP_IDLE),
22            Kind::KeepAliveInterval => (
23                Level::new(libc::IPPROTO_TCP),
24                Name::new(libc::TCP_KEEPINTVL),
25            ),
26            Kind::KeepAliveRetries => (Level::new(libc::IPPROTO_TCP), Name::new(libc::TCP_KEEPCNT)),
27        }
28    }
29
30    fn set(fd: fd::BorrowedFd<'_>, kind: Kind, value: &Value) -> Result<(), Errno> {
31        let (level, name) = Self::option(kind);
32        Self::set_option(fd, level.raw(), name.raw(), &value.raw())
33    }
34}