diff options
Diffstat (limited to 'third_party/rust/socket2/src/lib.rs')
-rw-r--r-- | third_party/rust/socket2/src/lib.rs | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/third_party/rust/socket2/src/lib.rs b/third_party/rust/socket2/src/lib.rs new file mode 100644 index 0000000000..cf599c8ed3 --- /dev/null +++ b/third_party/rust/socket2/src/lib.rs @@ -0,0 +1,142 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Utilities for handling sockets +//! +//! This crate is sort of an evolution of the `net2` crate after seeing the +//! issues on it over time. The intention of this crate is to provide as direct +//! as possible access to the system's functionality for sockets as possible. No +//! extra fluff (e.g. multiple syscalls or builders) provided in this crate. As +//! a result using this crate can be a little wordy, but it should give you +//! maximal flexibility over configuration of sockets. +//! +//! # Examples +//! +//! ```no_run +//! use std::net::SocketAddr; +//! use socket2::{Socket, Domain, Type}; +//! +//! // create a TCP listener bound to two addresses +//! let socket = Socket::new(Domain::ipv6(), Type::stream(), None).unwrap(); +//! +//! socket.bind(&"[::1]:12345".parse::<SocketAddr>().unwrap().into()).unwrap(); +//! socket.set_only_v6(false); +//! socket.listen(128).unwrap(); +//! +//! let listener = socket.into_tcp_listener(); +//! // ... +//! ``` + +#![doc(html_root_url = "https://docs.rs/socket2/0.3")] +#![deny(missing_docs)] + +use crate::utils::NetInt; + +#[cfg(any(unix, target_os = "redox"))] +use libc::{sockaddr_storage, socklen_t}; +#[cfg(windows)] +use winapi::shared::ws2def::SOCKADDR_STORAGE as sockaddr_storage; +#[cfg(windows)] +use winapi::um::ws2tcpip::socklen_t; + +mod sockaddr; +mod socket; +mod utils; + +#[cfg(unix)] +#[path = "sys/unix.rs"] +mod sys; +#[cfg(windows)] +#[path = "sys/windows.rs"] +mod sys; +#[cfg(target_os = "redox")] +#[path = "sys/redox/mod.rs"] +mod sys; + +/// Newtype, owned, wrapper around a system socket. +/// +/// This type simply wraps an instance of a file descriptor (`c_int`) on Unix +/// and an instance of `SOCKET` on Windows. This is the main type exported by +/// this crate and is intended to mirror the raw semantics of sockets on +/// platforms as closely as possible. Almost all methods correspond to +/// precisely one libc or OS API call which is essentially just a "Rustic +/// translation" of what's below. +/// +/// # Examples +/// +/// ```no_run +/// use std::net::SocketAddr; +/// use socket2::{Socket, Domain, Type, SockAddr}; +/// +/// // create a TCP listener bound to two addresses +/// let socket = Socket::new(Domain::ipv4(), Type::stream(), None).unwrap(); +/// +/// socket.bind(&"127.0.0.1:12345".parse::<SocketAddr>().unwrap().into()).unwrap(); +/// socket.bind(&"127.0.0.1:12346".parse::<SocketAddr>().unwrap().into()).unwrap(); +/// socket.listen(128).unwrap(); +/// +/// let listener = socket.into_tcp_listener(); +/// // ... +/// ``` +pub struct Socket { + inner: sys::Socket, +} + +/// The address of a socket. +/// +/// `SockAddr`s may be constructed directly to and from the standard library +/// `SocketAddr`, `SocketAddrV4`, and `SocketAddrV6` types. +pub struct SockAddr { + storage: sockaddr_storage, + len: socklen_t, +} + +/// Specification of the communication domain for a socket. +/// +/// This is a newtype wrapper around an integer which provides a nicer API in +/// addition to an injection point for documentation. Convenience constructors +/// such as `Domain::ipv4`, `Domain::ipv6`, etc, are provided to avoid reaching +/// into libc for various constants. +/// +/// This type is freely interconvertible with the `i32` type, however, if a raw +/// value needs to be provided. +#[derive(Copy, Clone)] +pub struct Domain(i32); + +/// Specification of communication semantics on a socket. +/// +/// This is a newtype wrapper around an integer which provides a nicer API in +/// addition to an injection point for documentation. Convenience constructors +/// such as `Type::stream`, `Type::dgram`, etc, are provided to avoid reaching +/// into libc for various constants. +/// +/// This type is freely interconvertible with the `i32` type, however, if a raw +/// value needs to be provided. +#[derive(Copy, Clone)] +pub struct Type(i32); + +/// Protocol specification used for creating sockets via `Socket::new`. +/// +/// This is a newtype wrapper around an integer which provides a nicer API in +/// addition to an injection point for documentation. +/// +/// This type is freely interconvertible with the `i32` type, however, if a raw +/// value needs to be provided. +#[derive(Copy, Clone)] +pub struct Protocol(i32); + +fn hton<I: NetInt>(i: I) -> I { + i.to_be() +} + +#[cfg(not(target_os = "redox"))] +fn ntoh<I: NetInt>(i: I) -> I { + I::from_be(i) +} |