extern crate argparse;
extern crate env_logger;
extern crate libmount;
#[macro_use]
extern crate log;

use std::path::PathBuf;
use std::process::exit;

use argparse::{ArgumentParser, Parse, StoreTrue};

fn main() {
    env_logger::init();
    let mut path = PathBuf::new();
    let mut bind = false;
    let mut readonly = false;
    let mut nodev = false;
    let mut noexec = false;
    let mut nosuid = false;
    {
        let mut ap = ArgumentParser::new();
        ap.set_description(
            "Remount utility. Similar to `mount -o remount` \
                            but keeps current mount point options",
        );
        ap.refer(&mut path)
            .add_argument("path", Parse, "Directory for remounting")
            .required();
        ap.refer(&mut bind)
            .add_option(&["--bind"], StoreTrue, "Set bind mount option");
        ap.refer(&mut readonly)
            .add_option(&["--readonly"], StoreTrue, "Set readonly mount option");
        ap.refer(&mut nodev)
            .add_option(&["--nodev"], StoreTrue, "Set nodev mount option");
        ap.refer(&mut noexec)
            .add_option(&["--noexec"], StoreTrue, "Set noexec mount option");
        ap.refer(&mut nosuid)
            .add_option(&["--nosuid"], StoreTrue, "Set nosuid mount option");
        ap.parse_args_or_exit();
    }
    match libmount::Remount::new(path)
        .bind(bind)
        .readonly(readonly)
        .nodev(nodev)
        .noexec(noexec)
        .nosuid(nosuid)
        .remount()
    {
        Ok(()) => {}
        Err(e) => {
            error!("{}", e);
            exit(1);
        }
    }
}
