diff options
Diffstat (limited to 'third_party/rust/iovec/src/sys/windows.rs')
-rw-r--r-- | third_party/rust/iovec/src/sys/windows.rs | 68 |
1 files changed, 68 insertions, 0 deletions
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, + }) + } + } +} |