Skip to main content

dope_core/
addr.rs

1#[derive(Clone, Copy, Debug)]
2pub struct SockAddr {
3    storage: libc::sockaddr_storage,
4    len: libc::socklen_t,
5}
6
7impl SockAddr {
8    pub fn empty() -> Self {
9        let storage =
10            unsafe { std::mem::MaybeUninit::<libc::sockaddr_storage>::zeroed().assume_init() };
11        Self {
12            storage,
13            len: std::mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t,
14        }
15    }
16
17    /// # Safety
18    /// `T` must be a valid `sockaddr_*` family struct and `len` its byte length.
19    pub unsafe fn from_storage<T>(addr: T, len: libc::socklen_t) -> Self {
20        let mut storage = std::mem::MaybeUninit::<libc::sockaddr_storage>::zeroed();
21        unsafe {
22            std::ptr::write(storage.as_mut_ptr() as *mut T, addr);
23        }
24        Self {
25            storage: unsafe { storage.assume_init() },
26            len,
27        }
28    }
29
30    pub fn storage_ptr(&self) -> *const libc::sockaddr_storage {
31        std::ptr::addr_of!(self.storage)
32    }
33
34    pub fn storage_mut_ptr(&mut self) -> *mut libc::sockaddr_storage {
35        std::ptr::addr_of_mut!(self.storage)
36    }
37
38    pub fn set_len(&mut self, len: libc::socklen_t) {
39        self.len = len;
40    }
41
42    pub fn addr_ptr(&self) -> *const libc::sockaddr {
43        std::ptr::addr_of!(self.storage) as *const libc::sockaddr
44    }
45
46    pub fn addr_mut_ptr(&mut self) -> *mut libc::sockaddr {
47        std::ptr::addr_of_mut!(self.storage) as *mut libc::sockaddr
48    }
49
50    pub fn addr_len(&self) -> libc::socklen_t {
51        self.len
52    }
53
54    pub fn addr_len_ptr(&mut self) -> *mut libc::socklen_t {
55        &mut self.len as *mut libc::socklen_t
56    }
57}