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
use std::io::{self, Write};

use consts::*;
use error;
use net::{ReadExt, WriteExt};

pub fn recv(r: &mut io::Read) -> Result<io::Cursor<Vec<u8>>, error::Error> {
    match try!(r.read_u16()) {
        0 => Err(from_raw_os_error!(EINTR)),
        u => {

            let mut cursor = io::Cursor::new(try!(r.read_vec(u as usize)));

            if cursor.read_u8().unwrap() != ERL_VERSION_MAGIC {
                return Err(from_raw_os_error!(EIO))
            }

            Ok(cursor)
        },
    }
}

pub fn send(w: &mut io::Write, v: &[u8]) -> Result<(), error::Error> {
    let len = 1 + v.len();
    let mut writer = io::BufWriter::with_capacity(2 + len, w);
    writer.write_u16(len as u16).unwrap();
    writer.write_u8(ERL_VERSION_MAGIC).unwrap();
    writer.write_slice(v).unwrap();
    writer.flush().or_else(|e| Err(From::from(e)))
}