Skip to content

Commit c582e73

Browse files
committed
Convert from SocketAddrV* to SockAddr with less copying
1 parent b831b44 commit c582e73

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

src/sockaddr.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -183,27 +183,28 @@ impl SockAddr {
183183

184184
impl From<SocketAddrV4> for SockAddr {
185185
fn from(addr: SocketAddrV4) -> SockAddr {
186-
let sockaddr_in = sockaddr_in {
186+
let mut storage = MaybeUninit::<sockaddr_storage>::uninit();
187+
let sockaddr_in = unsafe { &mut *(storage.as_mut_ptr() as *mut sockaddr_in) };
188+
*sockaddr_in = sockaddr_in {
187189
sin_family: AF_INET as sa_family_t,
188190
sin_port: addr.port().to_be(),
189191
sin_addr: in_addr {
190192
s_addr: u32::from_ne_bytes(addr.ip().octets()),
191193
},
192194
..unsafe { mem::zeroed() }
193195
};
194-
195-
unsafe {
196-
SockAddr::from_raw_parts(
197-
&sockaddr_in as *const _ as *const _,
198-
mem::size_of::<sockaddr_in>() as socklen_t,
199-
)
196+
SockAddr {
197+
storage: unsafe { storage.assume_init() },
198+
len: mem::size_of::<sockaddr_in>() as socklen_t,
200199
}
201200
}
202201
}
203202

204203
impl From<SocketAddrV6> for SockAddr {
205204
fn from(addr: SocketAddrV6) -> SockAddr {
206-
let sockaddr_in6 = sockaddr_in6 {
205+
let mut storage = MaybeUninit::<sockaddr_storage>::uninit();
206+
let sockaddr_in6 = unsafe { &mut *(storage.as_mut_ptr() as *mut sockaddr_in6) };
207+
*sockaddr_in6 = sockaddr_in6 {
207208
sin6_family: AF_INET6 as sa_family_t,
208209
sin6_port: addr.port().to_be(),
209210
sin6_addr: in6_addr {
@@ -213,11 +214,9 @@ impl From<SocketAddrV6> for SockAddr {
213214
sin6_scope_id: addr.scope_id(),
214215
..unsafe { mem::zeroed() }
215216
};
216-
unsafe {
217-
SockAddr::from_raw_parts(
218-
&sockaddr_in6 as *const _ as *const _,
219-
mem::size_of::<sockaddr_in6>() as socklen_t,
220-
)
217+
SockAddr {
218+
storage: unsafe { storage.assume_init() },
219+
len: mem::size_of::<sockaddr_in6>() as socklen_t,
221220
}
222221
}
223222
}

0 commit comments

Comments
 (0)