Skip to content

Commit 41d0e62

Browse files
ayosecwycats
authored andcommitted
Add getsockname(2) wrapper
1 parent f79e1c5 commit 41d0e62

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

src/sys/socket.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub use self::consts::*;
1010

1111
mod ffi {
1212
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};
1414

1515
extern {
1616
pub fn getsockopt(
@@ -467,3 +467,23 @@ pub fn setsockopt<T>(fd: Fd, level: SockLevel, opt: SockOpt, val: &T) -> SysResu
467467

468468
from_ffi(res)
469469
}
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

Comments
 (0)