src/pxar/fuse.rs: Improve comments, add rustfmt skip tag and reafctor

Also, removes an unused println statement in the decoder callback function and
fixes a typo.
Further, use ABI compatible Option<&T> for FFI to avoid use of raw pointers.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
This commit is contained in:
Christian Ebner 2019-09-06 11:38:26 +02:00 committed by Dietmar Maurer
parent f773f5d512
commit 8413083fc5
1 changed files with 23 additions and 18 deletions

View File

@ -10,20 +10,27 @@ use std::path::Path;
use std::sync::Mutex;
use failure::{bail, format_err, Error};
use libc::{c_char, c_int, c_void, size_t};
use libc;
use libc::{c_char, c_int, c_void, size_t};
use super::decoder::Decoder;
use super::format_definition::PxarGoodbyeItem;
/// Node ID of the root inode
/// This is the only one whose ID is not equal to the offset in the file.
/// This is ok since offset 1 is part of the entry header and will therefore
/// not occur again, but remapping to the correct offset of 0 is required.
/// Node ID of the root i-node
///
/// Offsets in the archive are used as i-node for the fuse implementation, as
/// they are unique and enough to reference each item in the pxar archive.
/// The only exception to this is the `FUSE_ROOT_ID`, which is defined as 1 by
/// the fuse library.
/// This is okay since offset 1 is part of the root directory entry header and
/// will therefore not occur again, but remapping to the correct offset of 0 is
/// required.
const FUSE_ROOT_ID: u64 = 1;
fn decoder_callback(path: &Path) -> Result<(), Error> {
println!("{:#?}", path);
/// Callback function for `super::decoder::Decoder`.
///
/// At the moment, this is only needed to satisfy the `SequentialDecoder`.
fn decoder_callback(_path: &Path) -> Result<(), Error> {
Ok(())
}
@ -33,14 +40,10 @@ type MutPtr = *mut c_void;
type ConstPtr = *const c_void;
type StrPtr = *const c_char;
#[rustfmt::skip]
#[link(name = "fuse3")]
extern "C" {
fn fuse_session_new(
args: *const FuseArgs,
oprs: *const Operations,
size: size_t,
op: ConstPtr,
) -> MutPtr;
fn fuse_session_new(args: Option<&FuseArgs>, oprs: Option<&Operations>, size: size_t, op: ConstPtr) -> MutPtr;
fn fuse_set_signal_handlers(session: ConstPtr) -> c_int;
fn fuse_remove_signal_handlers(session: ConstPtr);
fn fuse_daemonize(foreground: c_int) -> c_int;
@ -167,8 +170,8 @@ impl Session {
let session_decoder = Box::new(Mutex::new(decoder));
let session_ptr = unsafe {
fuse_session_new(
&args as *const FuseArgs,
&oprs as *const Operations,
Some(&args),
Some(&oprs),
std::mem::size_of::<Operations>(),
// Ownership of session_decoder is passed to the session here.
// It has to be reclaimed before dropping the session to free
@ -192,6 +195,8 @@ impl Session {
})
}
/// Mount the filesystem on the given mountpoint.
///
/// Actually mount the filesystem for this session on the provided mountpoint
/// and daemonize process.
pub fn mount(&mut self, mountpoint: &Path) -> Result<(), Error> {
@ -216,8 +221,8 @@ impl Session {
/// Execute session loop which handles requests from kernel.
///
/// The multi_threaded flag controls if the session loop runs in
/// singlethreaded or multithreaded.
/// Singlethreaded mode is intended for debugging.
/// single-threaded or multi-threaded mode.
/// Single-threaded mode is intended for debugging only.
pub fn run_loop(&mut self, multi_threaded: bool) -> Result<(), Error> {
if self.verbose {
println!("Executing fuse session loop");
@ -230,7 +235,7 @@ impl Session {
bail!("fuse session loop exited with - {}", result);
}
if result > 0 {
eprintln!("fuse session loop recieved signal - {}", result);
eprintln!("fuse session loop received signal - {}", result);
}
Ok(())