summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Richardson <rick.richardson@gmail.com>2014-12-30 14:19:18 -0500
committerRick Richardson <rick.richardson@gmail.com>2014-12-30 14:19:18 -0500
commit5bb9518aa029fc24da3fa71103d320919f2dd60c (patch)
treea69ccb75e175918415a8f336c7a41c954451227d
parent898674f93c2a4df6a8e2c9e07ed509ddb3d4e866 (diff)
downloadnix-5bb9518aa029fc24da3fa71103d320919f2dd60c.zip
added getpeername to sys/socket
-rw-r--r--src/sys/socket.rs24
1 files changed, 23 insertions, 1 deletions
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<T>(fd: Fd, level: SockLevel, opt: SockOpt, val: &T) -> SysResu
from_ffi(res)
}
+fn getpeername_sockaddr<T>(sockfd: Fd, addr: &T) -> SysResult<bool> {
+ let addrlen_expected = mem::size_of::<T>() 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<bool> {
+ 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<T>(sockfd: Fd, addr: &T) -> SysResult<bool> {
let addrlen_expected = mem::size_of::<T>() as socklen_t;
let mut addrlen = addrlen_expected;