dope_sys/io/socket/option/
source.rs1use std::os::fd;
2
3use crate::{
4 Errno,
5 io::{
6 socket,
7 socket::option::{Kind, Level, Name, Value},
8 },
9};
10
11pub 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}