rust_asio 0.1.0

Asynchronous I/O Library
Documentation
use std::mem;
use std::cmp;
use libc;

mod unix;
pub use self::unix::*;

pub mod async;


pub fn str2c_char(src: &str, dst: &mut [c_char]) {
    let len = cmp::min(dst.len()-1, src.len());
    for (dst, src) in dst.iter_mut().zip(src.chars()) {
        *dst = src as c_char;
    };
    dst[len] = '\0' as c_char;
}

pub fn c_char2string(src: &[c_char]) -> String {
    let mut s = String::new();
    for c in src {
        if *c == 0 {
            break;
        }
        s.push((*c as u8) as char);
    }
    s
}

pub fn raw_sockaddr_eq<T: AsRawSockAddr>(lhs: &T, rhs: &T) -> bool {
    unsafe {
        libc::memcmp(
            mem::transmute(lhs.as_raw_sockaddr()),
            mem::transmute(rhs.as_raw_sockaddr()),
            lhs.raw_socklen() as usize
        ) == 0 }
}

pub fn raw_sockaddr_cmp<T: AsRawSockAddr>(lhs: &T, rhs: &T) -> cmp::Ordering {
    match unsafe {
        libc::memcmp(
            mem::transmute(lhs.as_raw_sockaddr()),
            mem::transmute(rhs.as_raw_sockaddr()),
            lhs.raw_socklen() as usize
        ) }
    {
        0 => cmp::Ordering::Equal,
        x if x < 0 => cmp::Ordering::Less,
        _ => cmp::Ordering::Greater,
    }
}