1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/// Set options on sockets.
///
/// # Example
///
/// ```
/// let socket_fd = unsafe { nc::socket(nc::AF_INET, nc::SOCK_STREAM, 0) };
/// assert!(socket_fd.is_ok());
/// let socket_fd = socket_fd.unwrap();
///
/// // Enable tcp fast open.
/// let queue_len: i32 = 5;
/// let queue_len_ptr = &queue_len as *const i32 as usize;
/// let ret = unsafe {
/// nc::setsockopt(
/// socket_fd,
/// nc::IPPROTO_TCP,
/// nc::TCP_FASTOPEN,
/// queue_len_ptr,
/// std::mem::size_of_val(&queue_len) as u32,
/// )
/// };
/// assert!(ret.is_ok());
/// let ret = unsafe { nc::close(socket_fd) };
/// assert!(ret.is_ok());
/// ```
pub unsafe fn setsockopt(
sockfd: i32,
level: i32,
optname: i32,
optval: usize,
optlen: socklen_t,
) -> Result<(), Errno> {
let sockfd = sockfd as usize;
let level = level as usize;
let optname = optname as usize;
let optlen = optlen as usize;
syscall5(SYS_SETSOCKOPT, sockfd, level, optname, optval, optlen).map(drop)
}