diff options
author | Carl Lerche <me@carllerche.com> | 2014-10-30 09:42:09 -0700 |
---|---|---|
committer | Carl Lerche <me@carllerche.com> | 2014-10-30 09:42:09 -0700 |
commit | 4b339549d5b5840508ab13c1aec65c635ac1add7 (patch) | |
tree | 1fb005987e0810ebe63692cbf821beb9a8aa96ba | |
parent | 7eb5917dda239008ab5131d50e9260b5b41726dd (diff) | |
parent | 3384e3dec63bee7641c4a3361b07d4cdffc8ea5f (diff) | |
download | nix-4b339549d5b5840508ab13c1aec65c635ac1add7.zip |
Merge pull request #15 from ayosec/getsockname-function
Add getsockname(2) wrapper
-rw-r--r-- | src/sys/socket.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/sys/socket.rs b/src/sys/socket.rs index a15afa28..4d91bd0c 100644 --- a/src/sys/socket.rs +++ b/src/sys/socket.rs @@ -10,7 +10,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}; + pub use libc::{socket, listen, bind, accept, connect, setsockopt, sendto, recvfrom, getsockname}; extern { pub fn getsockopt( @@ -467,3 +467,23 @@ pub fn setsockopt<T>(fd: Fd, level: SockLevel, opt: SockOpt, val: &T) -> SysResu from_ffi(res) } + +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; + + let ret = unsafe { ffi::getsockname(sockfd, mem::transmute(addr), &mut addrlen) }; + if ret < 0 { + return Err(SysError::last()); + } + + Ok(addrlen == addrlen_expected) +} + +pub fn getsockname(sockfd: Fd, addr: &mut SockAddr) -> SysResult<bool> { + match *addr { + SockIpV4(ref addr) => getsockname_sockaddr(sockfd, addr), + SockIpV6(ref addr) => getsockname_sockaddr(sockfd, addr), + SockUnix(ref addr) => getsockname_sockaddr(sockfd, addr) + } +} |