1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 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) }
}