diff options
Diffstat (limited to 'third_party/rust/iovec')
-rw-r--r-- | third_party/rust/iovec/.cargo-checksum.json | 1 | ||||
-rw-r--r-- | third_party/rust/iovec/CHANGELOG.md | 19 | ||||
-rw-r--r-- | third_party/rust/iovec/Cargo.toml | 26 | ||||
-rw-r--r-- | third_party/rust/iovec/LICENSE-APACHE | 201 | ||||
-rw-r--r-- | third_party/rust/iovec/LICENSE-MIT | 25 | ||||
-rw-r--r-- | third_party/rust/iovec/README.md | 35 | ||||
-rw-r--r-- | third_party/rust/iovec/appveyor.yml | 16 | ||||
-rw-r--r-- | third_party/rust/iovec/src/lib.rs | 161 | ||||
-rw-r--r-- | third_party/rust/iovec/src/sys/mod.rs | 26 | ||||
-rw-r--r-- | third_party/rust/iovec/src/sys/unix.rs | 52 | ||||
-rw-r--r-- | third_party/rust/iovec/src/sys/unknown.rs | 57 | ||||
-rw-r--r-- | third_party/rust/iovec/src/sys/windows.rs | 68 | ||||
-rw-r--r-- | third_party/rust/iovec/src/unix.rs | 68 | ||||
-rw-r--r-- | third_party/rust/iovec/src/windows.rs | 0 |
14 files changed, 755 insertions, 0 deletions
diff --git a/third_party/rust/iovec/.cargo-checksum.json b/third_party/rust/iovec/.cargo-checksum.json new file mode 100644 index 0000000000..f32f73927e --- /dev/null +++ b/third_party/rust/iovec/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"28f825c00e2df6acf0bf80a327ee9f7f7fdec57e4c09072deb6c6ac48ad2c3be","Cargo.toml":"29f5cef61141b8926a4c84769ad2fcf06cf047c260043fe9bcc9c92b9ca4e696","LICENSE-APACHE":"01b5abb4a95cc87b220efbd67a1e99c74bef3d744806dd44b4d57e81db814962","LICENSE-MIT":"d4784f55731ba75b77ad73a52808914b26b2f93b69dd4c03249528a75afbd946","README.md":"247302d4c1dc621f150bc06fc0d37f7ad5a4f2dcf1aafe25f8dfe8eb4fe35921","appveyor.yml":"8c309c2779904317005c7f7404470daf2aad344571168a37da214e37833be2a9","src/lib.rs":"c27782fe0b3d5091d69d6153f8cbf934bcf091612c569127f0ea3bd2058d11e7","src/sys/mod.rs":"b19af7b93fd8d7a6f46234e0bb93ddbb12b175e57eff9cb0c0c195ea89ec56b4","src/sys/unix.rs":"8265b65eee3672c96460f4aae8b7b61179e17c8ca80646be3994bc05951228ae","src/sys/unknown.rs":"5057c208dcb309ec1b46a76b922948358ceb727958fb8bde4908948a3890057d","src/sys/windows.rs":"44abddcddf40a755dfdde6d5c68b972ed8417dc31ba4931d14eeccc32a0bb701","src/unix.rs":"76e76333e31dd53d1ea6704a880f4188014af09fe8be3cecd5239003b2a1fe7c","src/windows.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"package":"b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"}
\ No newline at end of file diff --git a/third_party/rust/iovec/CHANGELOG.md b/third_party/rust/iovec/CHANGELOG.md new file mode 100644 index 0000000000..73d6300a64 --- /dev/null +++ b/third_party/rust/iovec/CHANGELOG.md @@ -0,0 +1,19 @@ +# 0.1.4 (October 9, 2019) + +* Add missing `repr(C)`. + +# 0.1.3 (yanked) (October 8, 2019) + +* Remove dependency on old winapi 0.2 (#16) + +# 0.1.2 (January 26th, 2018) + +* Add support for non-windows/unix targets (#10) + +# 0.1.1 (October 5th, 2017) + +* Fix soundness bug: Assert slice lengths are always > 0 (#5) + +# 0.1.0 (March 14th, 2017) + +* Initial release diff --git a/third_party/rust/iovec/Cargo.toml b/third_party/rust/iovec/Cargo.toml new file mode 100644 index 0000000000..e950318358 --- /dev/null +++ b/third_party/rust/iovec/Cargo.toml @@ -0,0 +1,26 @@ +# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO +# +# When uploading crates to the registry Cargo will automatically +# "normalize" Cargo.toml files for maximal compatibility +# with all versions of Cargo and also rewrite `path` dependencies +# to registry (e.g., crates.io) dependencies +# +# If you believe there's an error in this file please file an +# issue against the rust-lang/cargo repository. If you're +# editing this file be aware that the upstream Cargo.toml +# will likely look very different (and much more reasonable) + +[package] +name = "iovec" +version = "0.1.4" +authors = ["Carl Lerche <me@carllerche.com>"] +description = "Portable buffer type for scatter/gather I/O operations\n" +homepage = "https://github.com/carllerche/iovec" +documentation = "https://docs.rs/iovec" +readme = "README.md" +keywords = ["scatter", "gather", "vectored", "io", "networking"] +categories = ["network-programming", "api-bindings"] +license = "MIT/Apache-2.0" +repository = "https://github.com/carllerche/iovec" +[target."cfg(unix)".dependencies.libc] +version = "0.2" diff --git a/third_party/rust/iovec/LICENSE-APACHE b/third_party/rust/iovec/LICENSE-APACHE new file mode 100644 index 0000000000..87d73e7f91 --- /dev/null +++ b/third_party/rust/iovec/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2017 Carl Lerche + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/third_party/rust/iovec/LICENSE-MIT b/third_party/rust/iovec/LICENSE-MIT new file mode 100644 index 0000000000..6c296bec80 --- /dev/null +++ b/third_party/rust/iovec/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2017 Carl Lerche + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/third_party/rust/iovec/README.md b/third_party/rust/iovec/README.md new file mode 100644 index 0000000000..6d2ea7bd73 --- /dev/null +++ b/third_party/rust/iovec/README.md @@ -0,0 +1,35 @@ +# IoVec + +A specialized byte slice type for performing vectored I/O operations. + +[![Crates.io](https://img.shields.io/crates/v/iovec.svg?maxAge=2592000)](https://crates.io/crates/iovec) +[![Build Status](https://travis-ci.org/carllerche/iovec.svg?branch=master)](https://travis-ci.org/carllerche/iovec) + +[Documentation](https://docs.rs/iovec) + +## Usage + +To use `iovec`, first add this to your `Cargo.toml`: + +```toml +[dependencies] +iovec = "0.1" +``` + +Next, add this to your crate: + +```rust +extern crate iovec; + +use iovec::IoVec; +``` + +For more detail, see [documentation](https://docs.rs/iovec). + +# License + +`iovec` is primarily distributed under the terms of both the MIT license and the +Apache License (Version 2.0), with portions covered by various BSD-like +licenses. + +See LICENSE-APACHE, and LICENSE-MIT for details. diff --git a/third_party/rust/iovec/appveyor.yml b/third_party/rust/iovec/appveyor.yml new file mode 100644 index 0000000000..4428146b98 --- /dev/null +++ b/third_party/rust/iovec/appveyor.yml @@ -0,0 +1,16 @@ +environment: + matrix: + - TARGET: x86_64-pc-windows-msvc + +install: + - curl -sSf -o rustup-init.exe https://win.rustup.rs/ + - rustup-init.exe -y --default-host %TARGET% + - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin + - rustc -V + - cargo -V + +build: false + +test_script: + - cargo build + - cargo test diff --git a/third_party/rust/iovec/src/lib.rs b/third_party/rust/iovec/src/lib.rs new file mode 100644 index 0000000000..1e091a46c9 --- /dev/null +++ b/third_party/rust/iovec/src/lib.rs @@ -0,0 +1,161 @@ +//! A specialized byte slice type for performing vectored I/O operations. +//! +//! For more detail, see [`IoVec`] documentation. +//! +//! [`IoVec`]: struct.IoVec.html + +#[cfg(unix)] +extern crate libc; + +mod sys; + +use std::{ops, mem}; + +#[cfg(unix)] +pub mod unix; + +/// Max length of an `IoVec` slice. +/// +/// Attempts to convert slices longer than this value will result in a panic. +pub const MAX_LENGTH: usize = sys::MAX_LENGTH; + +/// A specialized byte slice type for performing vectored I/O operations. +/// +/// On all systems, the types needed to perform vectored I/O systems have the +/// same size as Rust's [`slice`]. However, the layout is not necessarily the +/// same. `IoVec` provides a portable compatibility layer. +/// +/// The `IoVec` behaves like a Rust [`slice`], providing the same functions. +/// It also provides conversion functions to and from the OS specific vectored +/// types. +/// +/// [`slice`]: https://doc.rust-lang.org/std/primitive.slice.html +/// +/// # Examples +/// +/// ``` +/// use iovec::IoVec; +/// +/// let mut data = vec![]; +/// data.extend_from_slice(b"hello"); +/// +/// let iovec: &IoVec = data.as_slice().into(); +/// +/// assert_eq!(&iovec[..], &b"hello"[..]); +/// ``` +/// +/// # Panics +/// +/// Attempting to convert a zero-length slice or a slice longer than +/// [`MAX_LENGTH`] to an `IoVec` will result in a panic. +/// +/// [`MAX_LENGTH`]: constant.MAX_LENGTH.html +pub struct IoVec { + sys: sys::IoVec, +} + +impl IoVec { + pub fn from_bytes(slice: &[u8]) -> Option<&IoVec> { + if slice.len() == 0 { + return None + } + unsafe { + let iovec: &sys::IoVec = slice.into(); + Some(mem::transmute(iovec)) + } + } + + pub fn from_bytes_mut(slice: &mut [u8]) -> Option<&mut IoVec> { + if slice.len() == 0 { + return None + } + unsafe { + let iovec: &mut sys::IoVec = slice.into(); + Some(mem::transmute(iovec)) + } + } + + #[deprecated(since = "0.1.0", note = "deref instead")] + #[doc(hidden)] + pub fn as_bytes(&self) -> &[u8] { + &**self + } + + #[deprecated(since = "0.1.0", note = "deref instead")] + #[doc(hidden)] + pub fn as_mut_bytes(&mut self) -> &mut [u8] { + &mut **self + } +} + +impl ops::Deref for IoVec { + type Target = [u8]; + + fn deref(&self) -> &[u8] { + &self.sys.as_ref() + } +} + +impl ops::DerefMut for IoVec { + fn deref_mut(&mut self) -> &mut [u8] { + self.sys.as_mut() + } +} + +#[doc(hidden)] +impl<'a> From<&'a [u8]> for &'a IoVec { + fn from(bytes: &'a [u8]) -> &'a IoVec { + IoVec::from_bytes(bytes) + .expect("this crate accidentally accepted 0-sized slices \ + originally but this was since discovered as a soundness \ + hole, it's recommended to use the `from_bytes` \ + function instead") + } +} + +#[doc(hidden)] +impl<'a> From<&'a mut [u8]> for &'a mut IoVec { + fn from(bytes: &'a mut [u8]) -> &'a mut IoVec { + IoVec::from_bytes_mut(bytes) + .expect("this crate accidentally accepted 0-sized slices \ + originally but this was since discovered as a soundness \ + hole, it's recommended to use the `from_bytes_mut` \ + function instead") + } +} + +#[doc(hidden)] +impl<'a> Default for &'a IoVec { + fn default() -> Self { + panic!("this implementation was accidentally provided but is \ + unfortunately unsound, it's recommended to stop using \ + `IoVec::default` or construct a vector with a nonzero length"); + } +} + +#[doc(hidden)] +impl<'a> Default for &'a mut IoVec { + fn default() -> Self { + panic!("this implementation was accidentally provided but is \ + unfortunately unsound, it's recommended to stop using \ + `IoVec::default` or construct a vector with a nonzero length"); + } +} + +#[cfg(test)] +mod test { + use super::IoVec; + + #[test] + fn convert_ref() { + let buf: &IoVec = (&b"hello world"[..]).into(); + assert_eq!(buf[..], b"hello world"[..]); + } + + #[test] + fn convert_mut() { + let mut buf: Vec<u8> = b"hello world".to_vec(); + let buf: &mut IoVec = (&mut buf[..]).into(); + assert_eq!(buf[..], b"hello world"[..]); + } +} diff --git a/third_party/rust/iovec/src/sys/mod.rs b/third_party/rust/iovec/src/sys/mod.rs new file mode 100644 index 0000000000..3e0efc99e8 --- /dev/null +++ b/third_party/rust/iovec/src/sys/mod.rs @@ -0,0 +1,26 @@ +#[cfg(unix)] +mod unix; + +#[cfg(unix)] +pub use self::unix::{ + IoVec, + MAX_LENGTH, +}; + +#[cfg(windows)] +mod windows; + +#[cfg(windows)] +pub use self::windows::{ + IoVec, + MAX_LENGTH, +}; + +#[cfg(not(any(windows, unix)))] +mod unknown; + +#[cfg(not(any(windows, unix)))] +pub use self::unknown::{ + IoVec, + MAX_LENGTH, +}; diff --git a/third_party/rust/iovec/src/sys/unix.rs b/third_party/rust/iovec/src/sys/unix.rs new file mode 100644 index 0000000000..4dbc0674f8 --- /dev/null +++ b/third_party/rust/iovec/src/sys/unix.rs @@ -0,0 +1,52 @@ +use libc; +use std::{mem, slice, usize}; + +pub struct IoVec { + inner: [u8], +} + +pub const MAX_LENGTH: usize = usize::MAX; + +impl IoVec { + pub fn as_ref(&self) -> &[u8] { + unsafe { + let vec = self.iovec(); + slice::from_raw_parts(vec.iov_base as *const u8, vec.iov_len) + } + } + + pub fn as_mut(&mut self) -> &mut [u8] { + unsafe { + let vec = self.iovec(); + slice::from_raw_parts_mut(vec.iov_base as *mut u8, vec.iov_len) + } + } + + unsafe fn iovec(&self) -> libc::iovec { + mem::transmute(&self.inner) + } +} + +impl<'a> From<&'a [u8]> for &'a IoVec { + fn from(src: &'a [u8]) -> Self { + assert!(src.len() > 0); + unsafe { + mem::transmute(libc::iovec { + iov_base: src.as_ptr() as *mut _, + iov_len: src.len(), + }) + } + } +} + +impl<'a> From<&'a mut [u8]> for &'a mut IoVec { + fn from(src: &'a mut [u8]) -> Self { + assert!(src.len() > 0); + unsafe { + mem::transmute(libc::iovec { + iov_base: src.as_ptr() as *mut _, + iov_len: src.len(), + }) + } + } +} diff --git a/third_party/rust/iovec/src/sys/unknown.rs b/third_party/rust/iovec/src/sys/unknown.rs new file mode 100644 index 0000000000..37acedd78b --- /dev/null +++ b/third_party/rust/iovec/src/sys/unknown.rs @@ -0,0 +1,57 @@ +use std::{mem, slice, usize}; + +#[derive(Clone)] +pub struct WasmIoVec { + ptr: *const u8, + len: usize, +} + +pub struct IoVec { + inner: [u8], +} + +pub const MAX_LENGTH: usize = usize::MAX; + +impl IoVec { + pub fn as_ref(&self) -> &[u8] { + unsafe { + let vec = self.iovec(); + slice::from_raw_parts(vec.ptr as *const u8, vec.len) + } + } + + pub fn as_mut(&mut self) -> &mut [u8] { + unsafe { + let vec = self.iovec(); + slice::from_raw_parts_mut(vec.ptr as *mut u8, vec.len) + } + } + + unsafe fn iovec(&self) -> WasmIoVec { + mem::transmute(&self.inner) + } +} + +impl<'a> From<&'a [u8]> for &'a IoVec { + fn from(src: &'a [u8]) -> Self { + assert!(src.len() > 0); + unsafe { + mem::transmute(WasmIoVec { + ptr: src.as_ptr() as *mut _, + len: src.len(), + }) + } + } +} + +impl<'a> From<&'a mut [u8]> for &'a mut IoVec { + fn from(src: &'a mut [u8]) -> Self { + assert!(src.len() > 0); + unsafe { + mem::transmute(WasmIoVec { + ptr: src.as_ptr() as *mut _, + len: src.len(), + }) + } + } +} diff --git a/third_party/rust/iovec/src/sys/windows.rs b/third_party/rust/iovec/src/sys/windows.rs new file mode 100644 index 0000000000..fc5b8fb427 --- /dev/null +++ b/third_party/rust/iovec/src/sys/windows.rs @@ -0,0 +1,68 @@ +use std::{mem, slice, u32}; + +// declare the types we need directly here to avoid bringing +// in the old and slow winapi 0.2 dependency. + +type DWORD = u32; +type ULONG = u32; +type CHAR = i8; + +#[repr(C)] +struct WSABUF { + pub len: ULONG, + pub buf: *mut CHAR, +} + +pub struct IoVec { + inner: [u8], +} + +pub const MAX_LENGTH: usize = u32::MAX as usize; + +impl IoVec { + pub fn as_ref(&self) -> &[u8] { + unsafe { + let vec = self.wsabuf(); + slice::from_raw_parts(vec.buf as *const u8, vec.len as usize) + } + } + + pub fn as_mut(&mut self) -> &mut [u8] { + unsafe { + let vec = self.wsabuf(); + slice::from_raw_parts_mut(vec.buf as *mut u8, vec.len as usize) + } + } + + unsafe fn wsabuf(&self) -> WSABUF { + mem::transmute(&self.inner) + } +} + +impl<'a> From<&'a [u8]> for &'a IoVec { + fn from(src: &'a [u8]) -> Self { + assert!(src.len() > 0); + assert!(src.len() <= MAX_LENGTH); + + unsafe { + mem::transmute(WSABUF { + buf: src.as_ptr() as *mut _, + len: src.len() as DWORD, + }) + } + } +} + +impl<'a> From<&'a mut [u8]> for &'a mut IoVec { + fn from(src: &'a mut [u8]) -> Self { + assert!(src.len() > 0); + assert!(src.len() <= MAX_LENGTH); + + unsafe { + mem::transmute(WSABUF { + buf: src.as_ptr() as *mut _, + len: src.len() as DWORD, + }) + } + } +} diff --git a/third_party/rust/iovec/src/unix.rs b/third_party/rust/iovec/src/unix.rs new file mode 100644 index 0000000000..3ef3728bb0 --- /dev/null +++ b/third_party/rust/iovec/src/unix.rs @@ -0,0 +1,68 @@ +//! IoVec extensions for Unix platforms. +//! +//! These functions provide conversions to unix specific representations of the +//! vectored data. +//! +//! # Examples +//! +//! ``` +//! use iovec::IoVec; +//! use iovec::unix; +//! +//! let a = b"hello".to_vec(); +//! let b = b"world".to_vec(); +//! +//! let bufs: &[&IoVec] = &[(&a[..]).into(), (&b[..]).into()]; +//! let os_bufs = unix::as_os_slice(&bufs[..]); +//! +//! // Use the `os_bufs` slice with `writev`. +//! ``` + +use IoVec; +use libc; + +use std::mem; + +/// Convert a slice of `IoVec` refs to a slice of `libc::iovec`. +/// +/// The return value can be passed to `writev` bindings. +/// +/// # Examples +/// +/// ``` +/// use iovec::IoVec; +/// use iovec::unix; +/// +/// let a = b"hello".to_vec(); +/// let b = b"world".to_vec(); +/// +/// let bufs: &[&IoVec] = &[a[..].into(), b[..].into()]; +/// let os_bufs = unix::as_os_slice(bufs); +/// +/// // Use the `os_bufs` slice with `writev`. +/// ``` +pub fn as_os_slice<'a>(iov: &'a [&IoVec]) -> &'a [libc::iovec] { + unsafe { mem::transmute(iov) } +} + +/// Convert a mutable slice of `IoVec` refs to a mutable slice of `libc::iovec`. +/// +/// The return value can be passed to `readv` bindings. +/// +/// # Examples +/// +/// ``` +/// use iovec::IoVec; +/// use iovec::unix; +/// +/// let mut a = [0; 10]; +/// let mut b = [0; 10]; +/// +/// let bufs: &mut [&mut IoVec] = &mut [(&mut a[..]).into(), (&mut b[..]).into()]; +/// let os_bufs = unix::as_os_slice_mut(bufs); +/// +/// // Use the `os_bufs` slice with `readv`. +/// ``` +pub fn as_os_slice_mut<'a>(iov: &'a mut [&mut IoVec]) -> &'a mut [libc::iovec] { + unsafe { mem::transmute(iov) } +} diff --git a/third_party/rust/iovec/src/windows.rs b/third_party/rust/iovec/src/windows.rs new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/third_party/rust/iovec/src/windows.rs |