Skip to content
Snippets Groups Projects
mount.rs 3.07 KiB
Newer Older
#![deny(warnings)]
#![cfg_attr(unix, feature(libc))]

#[cfg(unix)]
extern crate libc;

Jeremy Soller's avatar
Jeremy Soller committed
#[cfg(target_os = "redox")]
extern crate syscall;

extern crate redoxfs;

use std::env;
use std::fs::File;
use std::os::unix::io::FromRawFd;
use std::process;

use redoxfs::{DiskCache, DiskFile, mount};

#[cfg(unix)]
fn fork() -> isize {
    unsafe { libc::fork() as isize }
}

#[cfg(unix)]
fn pipe(pipes: &mut [i32; 2]) -> isize {
Jeremy Soller's avatar
Jeremy Soller committed
    unsafe { libc::pipe(pipes.as_mut_ptr()) as isize }
}

#[cfg(target_os = "redox")]
fn fork() -> isize {
    unsafe { syscall::Error::mux(syscall::clone(0)) as isize }
}

#[cfg(target_os = "redox")]
fn pipe(pipes: &mut [usize; 2]) -> isize {
    syscall::Error::mux(syscall::pipe2(pipes, 0)) as isize
}

Jeremy Soller's avatar
Jeremy Soller committed
fn usage() {
    println!("redoxfs [disk] [mountpoint]");
}

fn main() {
    use std::io::{Read, Write};

    let mut pipes = [0; 2];
    if pipe(&mut pipes) == 0 {
        let mut read = unsafe { File::from_raw_fd(pipes[0]) };
        let mut write = unsafe { File::from_raw_fd(pipes[1]) };

        let pid = fork();
        if pid == 0 {
            drop(read);

            if let Some(path) = env::args().nth(1) {
                //Open an existing image
                match DiskFile::open(&path).map(|image| DiskCache::new(image)) {
                    Ok(disk) => match redoxfs::FileSystem::open(disk) {
                        Ok(filesystem) => {
                            println!("redoxfs: opened filesystem {}", path);

Jeremy Soller's avatar
Jeremy Soller committed
                            if let Some(mountpoint) = env::args().nth(2) {
Jeremy Soller's avatar
Jeremy Soller committed
                                match mount(filesystem, &mountpoint, || {
                                    println!("redoxfs: mounted filesystem on {}:", mountpoint);
                                    let _ = write.write(&[0]);
                                }) {
Jeremy Soller's avatar
Jeremy Soller committed
                                    Ok(()) => {
                                        process::exit(0);
                                    },
                                    Err(err) => {
                                        println!("redoxfs: failed to mount {} to {}: {}", path, mountpoint, err);
                                    }
                                }
                            } else {
                                println!("redoxfs: no mount point provided");
Jeremy Soller's avatar
Jeremy Soller committed
                                usage();
                            }
                        },
                        Err(err) => println!("redoxfs: failed to open filesystem {}: {}", path, err)
                    },
                    Err(err) => println!("redoxfs: failed to open image {}: {}", path, err)
                }

                let _ = write.write(&[1]);
                process::exit(1);
            } else {
                println!("redoxfs: no disk image provided");
Jeremy Soller's avatar
Jeremy Soller committed
                usage();
            }
        } else if pid > 0 {
            drop(write);

            let mut res = [0];
            read.read(&mut res).unwrap();

            process::exit(res[0] as i32);
        } else {
            panic!("redoxfs: failed to fork");
        }
    } else {
        panic!("redoxfs: failed to create pipe");
    }
}