src/pxar/fuse.rs: add function to map offset to inode and vice versa
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
This commit is contained in:
		
				
					committed by
					
						
						Dietmar Maurer
					
				
			
			
				
	
			
			
			
						parent
						
							c7fee396c6
						
					
				
				
					commit
					75933d1e83
				
			@ -14,12 +14,13 @@ use libc::{c_char, c_int, c_void, size_t};
 | 
			
		||||
use libc;
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
//const FUSE_ROOT_ID: u64 = 1;
 | 
			
		||||
const FUSE_ROOT_ID: u64 = 1;
 | 
			
		||||
 | 
			
		||||
fn decoder_callback(path: &Path) -> Result<(), Error> {
 | 
			
		||||
    println!("{:#?}", path);
 | 
			
		||||
@ -246,6 +247,38 @@ impl Drop for Session {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const GOODBYE_ITEM_SIZE: u64 = std::mem::size_of::<PxarGoodbyeItem>() as u64;
 | 
			
		||||
 | 
			
		||||
/// Converts the inode to the file offset
 | 
			
		||||
///
 | 
			
		||||
/// Since the inodes are defined as the file offset,
 | 
			
		||||
/// this simply returns the inode value.
 | 
			
		||||
/// The only exception to this is the inode of root,
 | 
			
		||||
/// which is defined as `FUSE_ROOT_ID` by libfuse and therefore mapped
 | 
			
		||||
/// to the roots goodbye table tail.
 | 
			
		||||
fn inode_to_offset(inode: u64, root_end: u64) -> u64 {
 | 
			
		||||
    if inode == FUSE_ROOT_ID {
 | 
			
		||||
        root_end - GOODBYE_ITEM_SIZE
 | 
			
		||||
    } else {
 | 
			
		||||
        inode
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Converts the file offset to an inode
 | 
			
		||||
///
 | 
			
		||||
/// Since the inodes are defined as the file offset,
 | 
			
		||||
/// this simply returns the offset value.
 | 
			
		||||
/// The only exception to this is the inode of root,
 | 
			
		||||
/// which is defined as `FUSE_ROOT_ID` by libfuse, so the roots goodbye tail
 | 
			
		||||
/// offset gets mapped to `FUSE_ROOT_ID`.
 | 
			
		||||
pub(crate) fn offset_to_inode(offset: u64, root_end: u64) -> u64 {
 | 
			
		||||
    if offset == root_end - GOODBYE_ITEM_SIZE {
 | 
			
		||||
        FUSE_ROOT_ID
 | 
			
		||||
    } else {
 | 
			
		||||
        offset
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Creates a context providing an exclusive mutable reference to the decoder.
 | 
			
		||||
///
 | 
			
		||||
/// Each callback function needing access to the decoder can easily get an
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user