rust_asio 0.6.0

Asynchronous I/O library
Documentation
use super::PODTrait;
use ffi::{self, sockaddr};

use std::mem;

impl PODTrait for ffi::sockaddr_in { }
impl PODTrait for ffi::sockaddr_in6 { }
impl PODTrait for ffi::sockaddr_storage { }

#[cfg(unix)]
impl PODTrait for ffi::sockaddr_un { }

#[derive(Clone)]
pub struct SockAddrImpl<T> {
    sa: T,
    sa_len: u8,
}

impl<T> SockAddrImpl<T> {
    pub fn size(&self) -> usize {
        self.sa_len as usize
    }

    pub fn resize(&mut self, sa_len: usize) {
        self.sa_len = sa_len as _
    }
}

impl<T: PODTrait> SockAddrImpl<T> {
    pub fn new(sa_family: i32, sa_len: usize) -> SockAddrImpl<T> {
        let mut sai = SockAddrImpl {
            sa: unsafe { mem::uninitialized() },
            sa_len: sa_len as _
        };
        let sa: &mut sockaddr = unsafe { &mut *(&mut sai as *mut _ as *mut _) };
        sa.sa_family = sa_family as u16;
        sai
    }

    pub fn capacity(&self) -> usize {
        mem::size_of_val(&self.sa)
    }

    pub fn data(&self) -> *const () {
        &self.sa as *const _ as *const _
    }
}

impl SockAddrImpl<Box<[u8]>> {
    pub fn from_vec(sa: Vec<u8>, sa_len: usize) -> SockAddrImpl<Box<[u8]>> {
        SockAddrImpl {
            sa: sa.into_boxed_slice(),
            sa_len: sa_len as _,
        }
    }

    pub fn capacity(&self) -> usize {
        self.sa.len()
    }

    pub fn data(&self) -> *const () {
        self.sa.as_ptr() as *const _
    }
}