@@ -10,7 +10,7 @@ pub use self::consts::*;
10
10
11
11
mod ffi {
12
12
use libc:: { c_int, c_void, socklen_t} ;
13
- pub use libc:: { socket, listen, bind, accept, connect, setsockopt, sendto, recvfrom} ;
13
+ pub use libc:: { socket, listen, bind, accept, connect, setsockopt, sendto, recvfrom, getsockname } ;
14
14
15
15
extern {
16
16
pub fn getsockopt (
@@ -467,3 +467,23 @@ pub fn setsockopt<T>(fd: Fd, level: SockLevel, opt: SockOpt, val: &T) -> SysResu
467
467
468
468
from_ffi ( res)
469
469
}
470
+
471
+ fn getsockname_sockaddr < T > ( sockfd : Fd , addr : & T ) -> SysResult < bool > {
472
+ let addrlen_expected = mem:: size_of :: < T > ( ) as socklen_t ;
473
+ let mut addrlen = addrlen_expected;
474
+
475
+ let ret = unsafe { ffi:: getsockname ( sockfd, mem:: transmute ( addr) , & mut addrlen) } ;
476
+ if ret < 0 {
477
+ return Err ( SysError :: last ( ) ) ;
478
+ }
479
+
480
+ Ok ( addrlen == addrlen_expected)
481
+ }
482
+
483
+ pub fn getsockname ( sockfd : Fd , addr : & mut SockAddr ) -> SysResult < bool > {
484
+ match * addr {
485
+ SockIpV4 ( ref addr) => getsockname_sockaddr ( sockfd, addr) ,
486
+ SockIpV6 ( ref addr) => getsockname_sockaddr ( sockfd, addr) ,
487
+ SockUnix ( ref addr) => getsockname_sockaddr ( sockfd, addr)
488
+ }
489
+ }
0 commit comments