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 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}