Skip to content
Snippets Groups Projects
mod.rs 1.43 KiB
Newer Older
use syscall;
use syscall::{Packet, Scheme};
use std::fs::File;
use std::io::{Error, ErrorKind, Read, Result, Write};
Jeremy Soller's avatar
Jeremy Soller committed
use filesystem::FileSystem;
use self::scheme::FileScheme;

pub mod resource;
pub mod scheme;

pub fn mount<D: Disk, P: AsRef<Path>, F: FnMut()>(filesystem: FileSystem<D>, mountpoint: &P, mut callback: F) -> Result<()> {
    let mountpoint = mountpoint.as_ref();
Jeremy Soller's avatar
Jeremy Soller committed
    let mut socket = File::create(format!(":{}", mountpoint.display()))?;

Jeremy Soller's avatar
Jeremy Soller committed
    callback();
Jeremy Soller's avatar
Jeremy Soller committed

    syscall::setrens(0, 0).expect("redoxfs: failed to enter null namespace");

Jeremy Soller's avatar
Jeremy Soller committed
    let scheme = FileScheme::new(format!("{}", mountpoint.display()), filesystem);
    let res = loop {
        if IS_UMT.load(Ordering::SeqCst) > 0 {
            break Ok(());
        }

Jeremy Soller's avatar
Jeremy Soller committed
        let mut packet = Packet::default();
        match socket.read(&mut packet) {
            Ok(_ok) => (),
            Err(err) => if err.kind() == ErrorKind::Interrupted {
                continue;
            } else {
                break Err(err);
            }
        }

Jeremy Soller's avatar
Jeremy Soller committed
        scheme.handle(&mut packet);

        match socket.write(&packet) {
            Ok(_ok) => (),
            Err(err) => {
                break Err(err);
            }
        }
    };

    {
        let mut fs = scheme.fs.borrow_mut();
        fs.close().map_err(|e| Error::new(ErrorKind::Interrupted,format!("{}",e)))?;