/// ("ro,default_permissions").
pub fn from_path(archive_path: &Path, options: &OsStr, verbose: bool) -> Result<Self, Error> {
let file = File::open(archive_path)?;
- let args = Self::setup_args(options, verbose)?;
- let oprs = Self::setup_callbacks();
-
- // By storing the decoder as userdata of the session, each request may
- // access it.
let reader = BufReader::new(file);
let decoder = Decoder::new(reader)?;
- Self::setup_session(decoder, args, oprs, verbose)
+ Self::new(decoder, options, verbose)
}
/// Create a new low level fuse session using the given `Decoder`.
) -> Result<Self, Error> {
let args = Self::setup_args(options, verbose)?;
let oprs = Self::setup_callbacks();
- Self::setup_session(decoder, args, oprs, verbose)
- }
-
- fn setup_args(options: &OsStr, verbose: bool) -> Result<Vec<CString>, Error> {
- // First argument should be the executable name
- let mut arguments = vec![
- CString::new("pxar-mount").unwrap(),
- CString::new("-o").unwrap(),
- CString::new(options.as_bytes())?,
- ];
- if verbose {
- arguments.push(CString::new("--debug").unwrap());
- }
-
- Ok(arguments)
- }
-
- fn setup_callbacks() -> Operations {
- // Register the callback functions for the session
- let mut oprs = Operations::default();
- oprs.init = Some(init);
- oprs.destroy = Some(destroy);
- oprs.lookup = Some(Self::lookup);
- oprs.getattr = Some(Self::getattr);
- oprs.readlink = Some(Self::readlink);
- oprs.open = Some(Self::open);
- oprs.read = Some(Self::read);
- oprs.opendir = Some(Self::opendir);
- oprs.readdir = Some(Self::readdir);
- oprs
- }
- fn setup_session(
- decoder: Decoder,
- args: Vec<CString>,
- oprs: Operations,
- verbose: bool,
- ) -> Result<Self, Error> {
let ctx = Context {
decoder,
goodbye_cache: None,
attr_cache: None,
ino_offset: 0,
};
+
let session_ctx = Box::new(Mutex::new(ctx));
let arg_ptrs: Vec<_> = args.iter().map(|opt| opt.as_ptr()).collect();
let fuse_args = FuseArgs {
bail!("error while setting signal handlers");
}
- Ok(Self {
- ptr: session_ptr,
- verbose,
- })
+ Ok(Self { ptr: session_ptr, verbose })
+ }
+
+ fn setup_args(options: &OsStr, verbose: bool) -> Result<Vec<CString>, Error> {
+ // First argument should be the executable name
+ let mut arguments = vec![
+ CString::new("pxar-mount").unwrap(),
+ CString::new("-o").unwrap(),
+ CString::new(options.as_bytes())?,
+ ];
+ if verbose {
+ arguments.push(CString::new("--debug").unwrap());
+ }
+
+ Ok(arguments)
+ }
+
+ fn setup_callbacks() -> Operations {
+ // Register the callback functions for the session
+ let mut oprs = Operations::default();
+ oprs.init = Some(init);
+ oprs.destroy = Some(destroy);
+ oprs.lookup = Some(Self::lookup);
+ oprs.getattr = Some(Self::getattr);
+ oprs.readlink = Some(Self::readlink);
+ oprs.open = Some(Self::open);
+ oprs.read = Some(Self::read);
+ oprs.opendir = Some(Self::opendir);
+ oprs.readdir = Some(Self::readdir);
+ oprs
}
/// Mount the filesystem on the given mountpoint.