ext2 0.1.1

Read and write on Ext2 partitions without mount
Documentation
#![cfg_attr(feature = "unstable", feature(io_error_more))]

mod tests_common;

use tests_common::*;

use ext2::OpenOptions;

use std::fs::File;
use std::io::{ErrorKind, Read, Seek, SeekFrom};
use std::str;

#[test]
fn read() {
    create_disk(1024 * 1024);
    mount_disk();
    create_dir("bananes").unwrap();
    create_file("bananes/toto.txt", "toto21toto42".as_bytes()).unwrap();
    umount_disk();

    let ext2 = new_ext2_instance::<File>();

    let mut f = OpenOptions::new()
        .read(true)
        .open("/bananes/toto.txt", ext2.clone())
        .unwrap();

    let mut buf = [0; 6];
    let size = f.read(&mut buf).unwrap();
    assert_eq!("toto21", str::from_utf8(&buf[..size]).unwrap());

    let mut buf = [0; 6];
    let size = f.read(&mut buf).unwrap();
    assert_eq!("toto42", str::from_utf8(&buf[..size]).unwrap());

    let mut buf = [0; 6];
    let size = f.read(&mut buf).unwrap();
    assert_eq!("", str::from_utf8(&buf[..size]).unwrap());

    match OpenOptions::new()
        .read(true)
        .open("/bananes/", ext2.clone())
        .map_err(|e| e.kind())
    {
        #[cfg(unstable)]
        Err(ErrorKind::IsADirectory) => {}
        #[cfg(not(unstable))]
        Err(ErrorKind::PermissionDenied) => {}
        _ => panic!("Must be Unsupported"),
    };

    let mut f = OpenOptions::new()
        .read(true)
        .open("/bananes/toto.txt", ext2.clone())
        .unwrap();
    f.seek(SeekFrom::End(3)).unwrap();
    let mut buf = [0; 6];
    let size = f.read(&mut buf).unwrap();
    assert_eq!("o42", str::from_utf8(&buf[..size]).unwrap());

    f.seek(SeekFrom::Start(3)).unwrap();
    let mut buf = [0; 6];
    let size = f.read(&mut buf).unwrap();
    assert_eq!("o21tot", str::from_utf8(&buf[..size]).unwrap());

    f.seek(SeekFrom::Current(-3)).unwrap();
    let mut buf = [0; 6];
    let size = f.read(&mut buf).unwrap();
    assert_eq!("toto42", str::from_utf8(&buf[..size]).unwrap());
}