diff options
Diffstat (limited to 'third_party/rust/iovec/src/sys')
-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 |
4 files changed, 203 insertions, 0 deletions
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, + }) + } + } +} |