diff options
| author | Aaron Turon <aturon@mozilla.com> | 2014-11-20 18:30:46 -0800 |
|---|---|---|
| committer | Aaron Turon <aturon@mozilla.com> | 2014-11-21 14:24:30 -0800 |
| commit | 1e661642105a1033f1c155ceb1b2335dd11cb40a (patch) | |
| tree | 7e1ed6f2eaf93ac4e2b49321aa003c1504ab07bc /src/libstd | |
| parent | af0c446d3b434a26c6d0482569bbf67e4d9b7df4 (diff) | |
| download | rust-1e661642105a1033f1c155ceb1b2335dd11cb40a.tar.gz rust-1e661642105a1033f1c155ceb1b2335dd11cb40a.zip | |
libs: add std::os::windows module
The new `std::os::windows` module exposes several extension traits for extracting file descriptors, sockets, and handles from `std::io` types.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/os.rs | 5 | ||||
| -rw-r--r-- | src/libstd/sys/windows/ext.rs | 100 | ||||
| -rw-r--r-- | src/libstd/sys/windows/mod.rs | 1 | ||||
| -rw-r--r-- | src/libstd/sys/windows/pipe.rs | 2 |
4 files changed, 107 insertions, 1 deletions
diff --git a/src/libstd/os.rs b/src/libstd/os.rs index d7ba4877086..2ba03ac5d60 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -62,6 +62,11 @@ use vec::Vec; #[cfg(unix)] use c_str::ToCStr; #[cfg(unix)] use libc::c_char; +#[cfg(unix)] +pub use sys::ext as unix; +#[cfg(windows)] +pub use sys::ext as windows; + /// Get the number of cores available pub fn num_cpus() -> uint { unsafe { diff --git a/src/libstd/sys/windows/ext.rs b/src/libstd/sys/windows/ext.rs new file mode 100644 index 00000000000..2c58ee69e8b --- /dev/null +++ b/src/libstd/sys/windows/ext.rs @@ -0,0 +1,100 @@ +// Copyright 2014 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. + +//! Experimental extensions to `std` for Windows. +//! +//! For now, this module is limited to extracting handles, file +//! descriptors, and sockets, but its functionality will grow over +//! time. + +#![experimental] + +use sys_common::AsInner; +use libc; + +use io; + +/// Raw HANDLEs. +pub type Handle = libc::HANDLE; + +/// Raw SOCKETs. +pub type Socket = libc::SOCKET; + +/// Extract raw handles. +pub trait AsRawHandle { + /// Extract the raw handle, without taking any ownership. + fn as_raw_handle(&self) -> Handle; +} + +impl AsRawHandle for io::fs::File { + fn as_raw_handle(&self) -> Handle { + self.as_inner().handle() + } +} + +impl AsRawHandle for io::pipe::PipeStream { + fn as_raw_handle(&self) -> Handle { + self.as_inner().handle() + } +} + +impl AsRawHandle for io::net::pipe::UnixStream { + fn as_raw_handle(&self) -> Handle { + self.as_inner().handle() + } +} + +impl AsRawHandle for io::net::pipe::UnixListener { + fn as_raw_handle(&self) -> Handle { + self.as_inner().handle() + } +} + +impl AsRawHandle for io::net::pipe::UnixAcceptor { + fn as_raw_handle(&self) -> Handle { + self.as_inner().handle() + } +} + +/// Extract raw sockets. +pub trait AsRawSocket { + fn as_raw_socket(&self) -> Socket; +} + +impl AsRawSocket for io::net::tcp::TcpStream { + fn as_raw_socket(&self) -> Socket { + self.as_inner().fd() + } +} + +impl AsRawSocket for io::net::tcp::TcpListener { + fn as_raw_socket(&self) -> Socket { + self.as_inner().fd() + } +} + +impl AsRawSocket for io::net::tcp::TcpAcceptor { + fn as_raw_socket(&self) -> Socket { + self.as_inner().fd() + } +} + +impl AsRawSocket for io::net::udp::UdpSocket { + fn as_raw_socket(&self) -> Socket { + self.as_inner().fd() + } +} + +/// A prelude for conveniently writing platform-specific code. +/// +/// Includes all extension traits, and some important type definitions. +pub mod prelude { + pub use super::{Socket, Handle, AsRawSocket, AsRawHandle}; +} diff --git a/src/libstd/sys/windows/mod.rs b/src/libstd/sys/windows/mod.rs index 815ace21f87..33e7094612e 100644 --- a/src/libstd/sys/windows/mod.rs +++ b/src/libstd/sys/windows/mod.rs @@ -34,6 +34,7 @@ macro_rules! helper_init( (static $name:ident: Helper<$m:ty>) => ( ) ) pub mod c; +pub mod ext; pub mod fs; pub mod os; pub mod tcp; diff --git a/src/libstd/sys/windows/pipe.rs b/src/libstd/sys/windows/pipe.rs index 60bd2b1370f..ca7985aa35b 100644 --- a/src/libstd/sys/windows/pipe.rs +++ b/src/libstd/sys/windows/pipe.rs @@ -735,7 +735,7 @@ impl UnixAcceptor { } pub fn handle(&self) -> libc::HANDLE { - self.event.ref0 + self.listener.handle() } } |
