Skip to main content

yanix/
socket.rs

1use crate::from_success_code;
2use std::io::Result;
3use std::os::unix::prelude::*;
4
5#[derive(Debug, Clone, Copy)]
6#[repr(i32)]
7pub enum SockType {
8    Stream = libc::SOCK_STREAM,
9    Datagram = libc::SOCK_DGRAM,
10    SeqPacket = libc::SOCK_SEQPACKET,
11    Raw = libc::SOCK_RAW,
12    Rdm = libc::SOCK_RDM,
13}
14
15pub unsafe fn get_socket_type(fd: RawFd) -> Result<SockType> {
16    use std::mem::{self, MaybeUninit};
17    let mut buffer = MaybeUninit::<SockType>::zeroed().assume_init();
18    let mut out_len = mem::size_of::<SockType>() as libc::socklen_t;
19    from_success_code(libc::getsockopt(
20        fd,
21        libc::SOL_SOCKET,
22        libc::SO_TYPE,
23        &mut buffer as *mut SockType as *mut _,
24        &mut out_len,
25    ))?;
26    assert_eq!(
27        out_len as usize,
28        mem::size_of::<SockType>(),
29        "invalid SockType value"
30    );
31    Ok(buffer)
32}