diff options
author | Carl Lerche <me@carllerche.com> | 2014-08-19 23:46:53 -0700 |
---|---|---|
committer | Carl Lerche <me@carllerche.com> | 2014-08-19 23:46:53 -0700 |
commit | 47f02ed0c5bb58c8b445437fe8366f4373523cc2 (patch) | |
tree | 8bfea78233431e4e9fd3bb7c0515d8e12b3b047f /src | |
parent | f85e9bfbe5bfef4d8ce5985d29d9a173aa4d5fb0 (diff) | |
download | nix-47f02ed0c5bb58c8b445437fe8366f4373523cc2.zip |
Start on socket options
Diffstat (limited to 'src')
-rw-r--r-- | src/errno.rs | 2 | ||||
-rw-r--r-- | src/sys/socket.rs | 85 |
2 files changed, 62 insertions, 25 deletions
diff --git a/src/errno.rs b/src/errno.rs index 852bd06e..b0f5baa9 100644 --- a/src/errno.rs +++ b/src/errno.rs @@ -31,7 +31,7 @@ impl SysError { impl fmt::Show for SysError { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - write!(fmt, "Errno {} - {}", self.kind as int, self.desc) + write!(fmt, "{} - {}", self.kind, self.desc) } } diff --git a/src/sys/socket.rs b/src/sys/socket.rs index 66ee48e2..9b3d1365 100644 --- a/src/sys/socket.rs +++ b/src/sys/socket.rs @@ -1,28 +1,20 @@ #![cfg(target_os = "linux")] use std::{mem, ptr}; -use libc::{c_int, sockaddr, sockaddr_in, sockaddr_in6, sockaddr_un, socklen_t}; +use libc::{c_int, sockaddr, socklen_t}; use fcntl::Fd; use errno::{SysResult, SysError, from_ffi}; +pub use libc::{in_addr, sockaddr_in, sockaddr_in6, sockaddr_un, sa_family_t}; + mod ffi { use libc::{c_int, sockaddr, socklen_t}; + pub use libc::{socket, listen, bind, accept, connect}; extern { - pub fn socket(domain: c_int, ty: c_int, proto: c_int) -> c_int; - - pub fn listen(sockfd: c_int, backlog: c_int) -> c_int; - - pub fn bind(sockfd: c_int, addr: *const sockaddr, addrlen: socklen_t) -> c_int; - - pub fn accept( - sockfd: c_int, - addr: *const sockaddr, - addrlen: *mut socklen_t) -> c_int; - pub fn accept4( sockfd: c_int, - addr: *const sockaddr, + addr: *mut sockaddr, addrlen: *mut socklen_t, flags: c_int) -> c_int; } @@ -67,18 +59,18 @@ pub fn listen(sockfd: Fd, backlog: uint) -> SysResult<()> { from_ffi(res) } -pub enum BindAddr<'a> { - BindIpV4(&'a sockaddr_in), - BindIpV6(&'a sockaddr_in6), - BindUnix(&'a sockaddr_un) +pub enum SockAddr { + SockIpV4(sockaddr_in), + SockIpV6(sockaddr_in6), + SockUnix(sockaddr_un) } -pub fn bind(sockfd: Fd, addr: BindAddr) -> SysResult<()> { +pub fn bind(sockfd: Fd, addr: &SockAddr) -> SysResult<()> { let res = unsafe { - match addr { - BindIpV4(addr) => ffi::bind(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_in>() as socklen_t), - BindIpV6(addr) => ffi::bind(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_in6>() as socklen_t), - BindUnix(addr) => ffi::bind(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_un>() as socklen_t) + match *addr { + SockIpV4(ref addr) => ffi::bind(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_in>() as socklen_t), + SockIpV6(ref addr) => ffi::bind(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_in6>() as socklen_t), + SockUnix(ref addr) => ffi::bind(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_un>() as socklen_t) } }; @@ -86,7 +78,7 @@ pub fn bind(sockfd: Fd, addr: BindAddr) -> SysResult<()> { } pub fn accept(sockfd: Fd) -> SysResult<Fd> { - let res = unsafe { ffi::accept(sockfd, ptr::null(), ptr::mut_null()) }; + let res = unsafe { ffi::accept(sockfd, ptr::mut_null(), ptr::mut_null()) }; if res < 0 { return Err(SysError::last()); @@ -97,7 +89,7 @@ pub fn accept(sockfd: Fd) -> SysResult<Fd> { pub fn accept4(sockfd: Fd, flags: SockFlag) -> SysResult<Fd> { // TODO: Check the kernel version - let res = unsafe { ffi::accept4(sockfd, ptr::null(), ptr::mut_null(), flags.bits) }; + let res = unsafe { ffi::accept4(sockfd, ptr::mut_null(), ptr::mut_null(), flags.bits) }; if res < 0 { return Err(SysError::last()); @@ -105,3 +97,48 @@ pub fn accept4(sockfd: Fd, flags: SockFlag) -> SysResult<Fd> { Ok(res) } + +pub fn connect(sockfd: Fd, addr: &SockAddr) -> SysResult<()> { + let res = unsafe { + match *addr { + SockIpV4(ref addr) => ffi::connect(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_in>() as socklen_t), + SockIpV6(ref addr) => ffi::connect(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_in6>() as socklen_t), + SockUnix(ref addr) => ffi::connect(sockfd, mem::transmute(addr), mem::size_of::<sockaddr_un>() as socklen_t) + } + }; + + from_ffi(res) +} + +pub type SockOpt = c_int; + +pub static SO_ACCEPTCONN: SockOpt = 30; +pub static SO_BINDTODEVICE: SockOpt = 25; +pub static SO_BROADCAST: SockOpt = 6; +pub static SO_BSDCOMPAT: SockOpt = 14; +pub static SO_DEBUG: SockOpt = 1; +pub static SO_DOMAIN: SockOpt = 39; +pub static SO_ERROR: SockOpt = 4; +pub static SO_DONTROUTE: SockOpt = 5; +pub static SO_KEEPALIVE: SockOpt = 9; +pub static SO_LINGER: SockOpt = 13; +pub static SO_MARK: SockOpt = 36; +pub static SO_OOBINLINE: SockOpt = 10; +pub static SO_PASSCRED: SockOpt = 16; +pub static SO_PEEK_OFF: SockOpt = 42; +pub static SO_PEERCRED: SockOpt = 17; +pub static SO_PRIORITY: SockOpt = 12; +pub static SO_PROTOCOL: SockOpt = 38; +pub static SO_RCVBUF: SockOpt = 8; +pub static SO_RCVBUFFORCE: SockOpt = 33; +pub static SO_RCVLOWAT: SockOpt = 18; +pub static SO_SNDLOWAT: SockOpt = 19; +pub static SO_RCVTIMEO: SockOpt = 20; +pub static SO_SNDTIMEO: SockOpt = 21; +pub static SO_REUSEADDR: SockOpt = 2; +pub static SO_RXQ_OVFL: SockOpt = 40; +pub static SO_SNDBUF: SockOpt = 7; +pub static SO_SNDBUFFORCE: SockOpt = 32; +pub static SO_TIMESTAMP: SockOpt = 29; +pub static SO_TYPE: SockOpt = 3; +pub static SO_BUSY_POLL: SockOpt = 46; |