Skip to content
Snippets Groups Projects
main.rs 2.38 KiB
Newer Older
Jeremy Soller's avatar
Jeremy Soller committed
extern crate redoxfs;

extern crate system;

use std::env;
use std::fs::File;
use std::io::{Read, Write};
use std::mem::size_of;
use std::sync::{Arc, Mutex};
use std::thread;
Jeremy Soller's avatar
Jeremy Soller committed

Jeremy Soller's avatar
Jeremy Soller committed
use cache::Cache;
Jeremy Soller's avatar
Jeremy Soller committed
use image::Image;
Jeremy Soller's avatar
Jeremy Soller committed
use scheme::FileScheme;
Jeremy Soller's avatar
Jeremy Soller committed

Jeremy Soller's avatar
Jeremy Soller committed
use redoxfs::FileSystem;
Jeremy Soller's avatar
Jeremy Soller committed

use system::scheme::{Packet, Scheme};

Jeremy Soller's avatar
Jeremy Soller committed
pub mod cache;
Jeremy Soller's avatar
Jeremy Soller committed
pub mod image;
Jeremy Soller's avatar
Jeremy Soller committed
pub mod resource;
pub mod scheme;
Jeremy Soller's avatar
Jeremy Soller committed

enum Status {
    Starting,
    Running,
    Stopping
Jeremy Soller's avatar
Jeremy Soller committed
}

fn main() {
    if let Some(path) = env::args().nth(1) {
        let status_mutex = Arc::new(Mutex::new(Status::Starting));

        let status_daemon = status_mutex.clone();
        thread::spawn(move || {
Jeremy Soller's avatar
Jeremy Soller committed
            match Image::open(&path).map(|image| Cache::new(image)) {
                Ok(disk) => match FileSystem::open(Box::new(disk)) {
                    Ok(fs) => match File::create(":file") {
                        Ok(mut socket) => {
                            println!("redoxfs: mounted filesystem {} on file:", path);

                            *status_daemon.lock().unwrap() = Status::Running;

                            let mut scheme = FileScheme::new(fs);
                            loop {
                                let mut packet = Packet::default();
                                while socket.read(&mut packet).unwrap() == size_of::<Packet>() {
                                    // println!("Read {:?}", packet);
                                    scheme.handle(&mut packet);
                                    // println!("Write {:?}", packet);
                                    socket.write(&packet).unwrap();
                                }
                            }
                        },
                        Err(err) => println!("redoxfs: failed to create file scheme: {}", err)
                    },
                    Err(err) => println!("redoxfs: failed to open filesystem {}: {}", path, err)
Jeremy Soller's avatar
Jeremy Soller committed
                },
                Err(err) => println!("redoxfs: failed to open image {}: {}", path, err)
            }

            *status_daemon.lock().unwrap() = Status::Stopping;
        });

        'waiting: loop {
            match *status_mutex.lock().unwrap() {
                Status::Starting => (),
                Status::Running => break 'waiting,
                Status::Stopping => break 'waiting,
            }

            thread::sleep_ms(30);
Jeremy Soller's avatar
Jeremy Soller committed
        }
    } else {
        println!("redoxfs: no disk image provided");
    }
}