#![cfg(test)]
use fuse;
use nix::{sys, unistd};
use std::env;
use std::fs;
use std::os::unix;
use std::path::PathBuf;
use tempfile::{TempDir, tempdir};
use users;
pub struct AllFileTypes {
#[allow(unused)] root: TempDir,
pub entries: Vec<(fuse::FileType, PathBuf)>,
}
impl AllFileTypes {
pub fn new() -> Self {
let root = tempdir().unwrap();
let mut entries: Vec<(fuse::FileType, PathBuf)> = vec!();
if unistd::getuid().is_root() {
let block_device = root.path().join("block_device");
sys::stat::mknod(
&block_device, sys::stat::SFlag::S_IFBLK, sys::stat::Mode::S_IRUSR, 50).unwrap();
entries.push((fuse::FileType::BlockDevice, block_device));
let char_device = root.path().join("char_device");
sys::stat::mknod(
&char_device, sys::stat::SFlag::S_IFCHR, sys::stat::Mode::S_IRUSR, 50).unwrap();
entries.push((fuse::FileType::CharDevice, char_device));
} else {
warn!("Not running as root; cannot create block/char devices");
}
let directory = root.path().join("dir");
fs::create_dir(&directory).unwrap();
entries.push((fuse::FileType::Directory, directory));
let named_pipe = root.path().join("named_pipe");
unistd::mkfifo(&named_pipe, sys::stat::Mode::S_IRUSR).unwrap();
entries.push((fuse::FileType::NamedPipe, named_pipe));
let regular = root.path().join("regular");
drop(fs::File::create(®ular).unwrap());
entries.push((fuse::FileType::RegularFile, regular));
let socket = root.path().join("socket");
drop(unix::net::UnixListener::bind(&socket).unwrap());
entries.push((fuse::FileType::Socket, socket));
let symlink = root.path().join("symlink");
unix::fs::symlink("irrelevant", &symlink).unwrap();
entries.push((fuse::FileType::Symlink, symlink));
AllFileTypes { root, entries }
}
}
pub struct Config {
pub unprivileged_user: Option<users::User>,
}
impl Config {
pub fn get() -> Config {
let unprivileged_user = env::var("UNPRIVILEGED_USER")
.map(|name| users::get_user_by_name(&name)).unwrap_or(None);
Config { unprivileged_user }
}
}