vblk 0.1.2

Virtual block devices on Linux
Documentation
use std::io::Result;
use vblk::{mount, BlockDevice};

struct RamDisk {
    memory: Vec<u8>,
}

impl BlockDevice for RamDisk {
    fn read(&mut self, offset: u64, bytes: &mut [u8]) -> Result<()> {
        println!("read request offset {} len {}", offset, bytes.len());

        bytes.copy_from_slice(&self.memory[offset as usize..offset as usize + bytes.len()]);

        Ok(())
    }

    fn write(&mut self, offset: u64, bytes: &[u8]) -> Result<()> {
        println!("write request offset {} len {}", offset, bytes.len());

        self.memory[offset as usize..offset as usize + bytes.len()].copy_from_slice(bytes);

        Ok(())
    }

    fn unmount(&mut self) {
        println!("ramdisk unmounted!");
    }

    fn flush(&mut self) -> Result<()> {
        println!("flush request");

        Ok(())
    }

    fn block_size(&self) -> u32 {
        1024
    }

    fn blocks(&self) -> u64 {
        (self.memory.len() / 1024) as u64
    }
}

fn main() {
    const RAMDISK_SIZE: usize = 33_554_432;

    let mut disk = RamDisk {
        memory: vec![0; RAMDISK_SIZE],
    };

    unsafe {
        mount(&mut disk, "/dev/nbd0", |device| {
            ctrlc::set_handler(move || {
                device.unmount().unwrap();
            })
            .unwrap();

            Ok(())
        })
        .unwrap();
    }

    println!("exiting gracefully...");
}