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}