Skip to content
Snippets Groups Projects
main.rs 2.3 KiB
Newer Older
Jeremy Soller's avatar
Jeremy Soller committed
#![deny(warnings)]

Jeremy Soller's avatar
Jeremy Soller committed
extern crate redoxfs;
Jeremy Soller's avatar
Jeremy Soller committed
extern crate spin;
extern crate syscall;
Jeremy Soller's avatar
Jeremy Soller committed

use std::env;
use std::fs::File;
use std::io::{Read, Write};
use std::mem::size_of;
Jeremy Soller's avatar
Jeremy Soller committed
use std::sync::Arc;
Jeremy Soller's avatar
Jeremy Soller committed
use spin::Mutex;
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

Jeremy Soller's avatar
Jeremy Soller committed
use syscall::{Packet, Scheme};
Jeremy Soller's avatar
Jeremy Soller committed

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);

Jeremy Soller's avatar
Jeremy Soller committed
                            *status_daemon.lock() = Status::Running;
Jeremy Soller's avatar
Jeremy Soller committed
                            let scheme = FileScheme::new(fs);
                            loop {
                                let mut packet = Packet::default();
                                socket.read(&mut packet).unwrap();
                                println!("file: {:?}", packet);
                                scheme.handle(&mut packet);
                                println!("file: ={}", packet.a);
                                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)
            }

Jeremy Soller's avatar
Jeremy Soller committed
            *status_daemon.lock() = Status::Stopping;
Jeremy Soller's avatar
Jeremy Soller committed
            match *status_mutex.lock() {
                Status::Starting => (),
                Status::Running => break 'waiting,
                Status::Stopping => break 'waiting,
            }

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