summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Lerche <me@carllerche.com>2014-10-30 09:42:09 -0700
committerCarl Lerche <me@carllerche.com>2014-10-30 09:42:09 -0700
commit4b339549d5b5840508ab13c1aec65c635ac1add7 (patch)
tree1fb005987e0810ebe63692cbf821beb9a8aa96ba
parent7eb5917dda239008ab5131d50e9260b5b41726dd (diff)
parent3384e3dec63bee7641c4a3361b07d4cdffc8ea5f (diff)
downloadnix-4b339549d5b5840508ab13c1aec65c635ac1add7.zip
Merge pull request #15 from ayosec/getsockname-function
Add getsockname(2) wrapper
-rw-r--r--src/sys/socket.rs22
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)
+ }
+}