Skip to content

Commit 053735f

Browse files
committed
Refactor Socket::peer_addr
1 parent 8e05ced commit 053735f

File tree

3 files changed

+29
-29
lines changed

3 files changed

+29
-29
lines changed

src/socket.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,15 @@ impl Socket {
210210
sys::getsockname(self.inner)
211211
}
212212

213-
/// Returns the socket address of the remote peer of this TCP connection.
213+
/// Returns the socket address of the remote peer of this socket.
214+
///
215+
/// # Notes
216+
///
217+
/// This returns an error if the socket is not [`connect`ed].
218+
///
219+
/// [`connect`ed]: Socket::connect
214220
pub fn peer_addr(&self) -> io::Result<SockAddr> {
215-
self.inner().peer_addr()
221+
sys::getpeername(self.inner)
216222
}
217223

218224
/// Creates a new independently owned handle to the underlying socket.

src/sys/unix.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,13 @@ pub(crate) fn getsockname(fd: SysSocket) -> io::Result<SockAddr> {
339339
.map(|_| unsafe { SockAddr::from_raw_parts(&storage as *const _ as *const _, len) })
340340
}
341341

342+
pub(crate) fn getpeername(fd: SysSocket) -> io::Result<SockAddr> {
343+
let mut storage: libc::sockaddr_storage = unsafe { mem::zeroed() };
344+
let mut len = size_of_val(&storage) as libc::socklen_t;
345+
syscall!(getpeername(fd, &mut storage as *mut _ as *mut _, &mut len,))
346+
.map(|_| unsafe { SockAddr::from_raw_parts(&storage as *const _ as *const _, len) })
347+
}
348+
342349
/// Unix only API.
343350
impl crate::Socket {
344351
/// Accept a new incoming connection from this listener.
@@ -434,17 +441,6 @@ pub struct Socket {
434441
}
435442

436443
impl Socket {
437-
pub fn peer_addr(&self) -> io::Result<SockAddr> {
438-
let mut storage: libc::sockaddr_storage = unsafe { mem::zeroed() };
439-
let mut len = mem::size_of_val(&storage) as libc::socklen_t;
440-
syscall!(getpeername(
441-
self.fd,
442-
&mut storage as *mut _ as *mut _,
443-
&mut len,
444-
))?;
445-
Ok(unsafe { SockAddr::from_raw_parts(&storage as *const _ as *const _, len) })
446-
}
447-
448444
pub fn try_clone(&self) -> io::Result<Socket> {
449445
// implementation lifted from libstd
450446
#[cfg(any(target_os = "android", target_os = "haiku"))]
@@ -1052,7 +1048,7 @@ impl fmt::Debug for Socket {
10521048
if let Ok(addr) = getsockname(self.fd) {
10531049
f.field("local_addr", &addr);
10541050
}
1055-
if let Ok(addr) = self.peer_addr() {
1051+
if let Ok(addr) = getpeername(self.fd) {
10561052
f.field("peer_addr", &addr);
10571053
}
10581054
f.finish()

src/sys/windows.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,18 @@ pub(crate) fn getsockname(socket: SysSocket) -> io::Result<SockAddr> {
193193
.map(|_| unsafe { SockAddr::from_raw_parts(&storage as *const _ as *const _, len) })
194194
}
195195

196+
pub(crate) fn getpeername(socket: SysSocket) -> io::Result<SockAddr> {
197+
// Safety: zeroed `SOCKADDR_STORAGE` is valid.
198+
let mut storage: SOCKADDR_STORAGE = unsafe { mem::zeroed() };
199+
let mut len = size_of_val(&storage) as c_int;
200+
syscall!(
201+
getpeername(socket, &mut storage as *mut _ as *mut _, &mut len),
202+
PartialEq::eq,
203+
sock::SOCKET_ERROR
204+
)
205+
.map(|_| unsafe { SockAddr::from_raw_parts(&storage as *const _ as *const _, len) })
206+
}
207+
196208
impl crate::Socket {
197209
/// Sets `HANDLE_FLAG_INHERIT` to zero using `SetHandleInformation`.
198210
pub fn set_no_inherit(&self) -> io::Result<()> {
@@ -211,20 +223,6 @@ pub struct Socket {
211223
}
212224

213225
impl Socket {
214-
pub fn peer_addr(&self) -> io::Result<SockAddr> {
215-
unsafe {
216-
let mut storage: SOCKADDR_STORAGE = mem::zeroed();
217-
let mut len = mem::size_of_val(&storage) as c_int;
218-
if sock::getpeername(self.socket, &mut storage as *mut _ as *mut _, &mut len) != 0 {
219-
return Err(last_error());
220-
}
221-
Ok(SockAddr::from_raw_parts(
222-
&storage as *const _ as *const _,
223-
len,
224-
))
225-
}
226-
}
227-
228226
pub fn try_clone(&self) -> io::Result<Socket> {
229227
unsafe {
230228
let mut info: sock::WSAPROTOCOL_INFOW = mem::zeroed();
@@ -895,7 +893,7 @@ impl fmt::Debug for Socket {
895893
if let Ok(addr) = getsockname(self.socket) {
896894
f.field("local_addr", &addr);
897895
}
898-
if let Ok(addr) = self.peer_addr() {
896+
if let Ok(addr) = getpeername(self.socket) {
899897
f.field("peer_addr", &addr);
900898
}
901899
f.finish()

0 commit comments

Comments
 (0)