9
9
#[ cfg( not( target_os = "redox" ) ) ]
10
10
use std:: io:: { IoSlice , IoSliceMut } ;
11
11
use std:: io:: { Read , Write } ;
12
+ use std:: mem:: { self , size_of_val} ;
12
13
use std:: net:: Shutdown ;
13
14
use std:: net:: { self , Ipv4Addr , Ipv6Addr } ;
14
15
#[ cfg( feature = "all" ) ]
@@ -21,7 +22,7 @@ use std::path::Path;
21
22
use std:: ptr;
22
23
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
23
24
use std:: time:: Duration ;
24
- use std:: { cmp, fmt, io, mem } ;
25
+ use std:: { cmp, fmt, io} ;
25
26
26
27
use libc:: { self , c_void, in6_addr, in_addr, ssize_t} ;
27
28
@@ -324,13 +325,20 @@ pub(crate) fn listen(fd: SysSocket, backlog: i32) -> io::Result<()> {
324
325
pub ( crate ) fn accept ( fd : SysSocket ) -> io:: Result < ( SysSocket , SockAddr ) > {
325
326
// Safety: zeroed `sockaddr_storage` is valid.
326
327
let mut storage: libc:: sockaddr_storage = unsafe { mem:: zeroed ( ) } ;
327
- let mut len = mem :: size_of_val ( & storage) as socklen_t ;
328
+ let mut len = size_of_val ( & storage) as socklen_t ;
328
329
syscall ! ( accept( fd, & mut storage as * mut _ as * mut _, & mut len) ) . map ( |fd| {
329
330
let addr = unsafe { SockAddr :: from_raw_parts ( & storage as * const _ as * const _ , len) } ;
330
331
( fd, addr)
331
332
} )
332
333
}
333
334
335
+ pub ( crate ) fn getsockname ( fd : SysSocket ) -> io:: Result < SockAddr > {
336
+ let mut storage: libc:: sockaddr_storage = unsafe { mem:: zeroed ( ) } ;
337
+ let mut len = size_of_val ( & storage) as libc:: socklen_t ;
338
+ syscall ! ( getsockname( fd, & mut storage as * mut _ as * mut _, & mut len, ) )
339
+ . map ( |_| unsafe { SockAddr :: from_raw_parts ( & storage as * const _ as * const _ , len) } )
340
+ }
341
+
334
342
/// Unix only API.
335
343
impl crate :: Socket {
336
344
/// Accept a new incoming connection from this listener.
@@ -426,17 +434,6 @@ pub struct Socket {
426
434
}
427
435
428
436
impl Socket {
429
- pub fn local_addr ( & self ) -> io:: Result < SockAddr > {
430
- let mut storage: libc:: sockaddr_storage = unsafe { mem:: zeroed ( ) } ;
431
- let mut len = mem:: size_of_val ( & storage) as libc:: socklen_t ;
432
- syscall ! ( getsockname(
433
- self . fd,
434
- & mut storage as * mut _ as * mut _,
435
- & mut len,
436
- ) ) ?;
437
- Ok ( unsafe { SockAddr :: from_raw_parts ( & storage as * const _ as * const _ , len) } )
438
- }
439
-
440
437
pub fn peer_addr ( & self ) -> io:: Result < SockAddr > {
441
438
let mut storage: libc:: sockaddr_storage = unsafe { mem:: zeroed ( ) } ;
442
439
let mut len = mem:: size_of_val ( & storage) as libc:: socklen_t ;
@@ -1052,7 +1049,7 @@ impl fmt::Debug for Socket {
1052
1049
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1053
1050
let mut f = f. debug_struct ( "Socket" ) ;
1054
1051
f. field ( "fd" , & self . fd ) ;
1055
- if let Ok ( addr) = self . local_addr ( ) {
1052
+ if let Ok ( addr) = getsockname ( self . fd ) {
1056
1053
f. field ( "local_addr" , & addr) ;
1057
1054
}
1058
1055
if let Ok ( addr) = self . peer_addr ( ) {
0 commit comments