From 5bb9518aa029fc24da3fa71103d320919f2dd60c Mon Sep 17 00:00:00 2001 From: Rick Richardson Date: Tue, 30 Dec 2014 14:19:18 -0500 Subject: added getpeername to sys/socket --- src/sys/socket.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/sys/socket.rs b/src/sys/socket.rs index ce5a113d..09dda4d2 100644 --- a/src/sys/socket.rs +++ b/src/sys/socket.rs @@ -11,7 +11,7 @@ pub use self::consts::*; mod ffi { use libc::{c_int, c_void, socklen_t}; - pub use libc::{socket, listen, bind, accept, connect, setsockopt, sendto, recvfrom, getsockname}; + pub use libc::{socket, listen, bind, accept, connect, setsockopt, sendto, recvfrom, getsockname, getpeername}; extern { pub fn getsockopt( @@ -480,6 +480,28 @@ pub fn setsockopt(fd: Fd, level: SockLevel, opt: SockOpt, val: &T) -> SysResu from_ffi(res) } +fn getpeername_sockaddr(sockfd: Fd, addr: &T) -> SysResult { + let addrlen_expected = mem::size_of::() as socklen_t; + let mut addrlen = addrlen_expected; + + let ret = unsafe { ffi::getpeername(sockfd, mem::transmute(addr), &mut addrlen) }; + if ret < 0 { + return Err(SysError::last()); + } + + Ok(addrlen == addrlen_expected) +} + +pub fn getpeername(sockfd: Fd, addr: &mut SockAddr) -> SysResult { + use self::SockAddr::*; + + match *addr { + SockIpV4(ref addr) => getpeername_sockaddr(sockfd, addr), + SockIpV6(ref addr) => getpeername_sockaddr(sockfd, addr), + SockUnix(ref addr) => getpeername_sockaddr(sockfd, addr) + } +} + fn getsockname_sockaddr(sockfd: Fd, addr: &T) -> SysResult { let addrlen_expected = mem::size_of::() as socklen_t; let mut addrlen = addrlen_expected; -- cgit v1.2.3