Skip to main content

InodeTable

Struct InodeTable 

Source
pub struct InodeTable { /* private fields */ }
Expand description

Bidirectional mapping between FUSE inodes and MTP objects, with cached metadata.

Implementations§

Source§

impl InodeTable

Source

pub fn new() -> Self

Creates a new table with only the root inode (inode 1).

Source

pub fn bump_generation(&mut self)

Marks every cached object handle as stale, without touching inode numbers, names, or the tree shape. Called after a reconnect: the kernel and any open file descriptor keep referring to the same inodes, while the handles behind them get re-resolved by path on next use.

Source

pub fn is_fresh(&self, inode: u64) -> bool

Whether this inode’s handle was resolved against the current session. Storage and root entries carry no session-scoped handle, so they’re always fresh (their storage IDs are re-mapped eagerly on reconnect).

Source

pub fn set_handle(&mut self, inode: u64, handle: ObjectHandle)

Points an inode at a freshly resolved handle, keeping its inode number.

Source

pub fn set_storage_id(&mut self, inode: u64, storage_id: StorageId)

Re-points a storage inode at a storage ID from the current session.

Source

pub fn add_storage(&mut self, storage_id: StorageId, name: String) -> u64

Adds a storage as a child of root. Returns the new inode number.

Source

pub fn add_object( &mut self, parent_inode: u64, handle: ObjectHandle, name: String, is_dir: bool, size: u64, mtime: SystemTime, ) -> u64

Adds a file or directory under the given parent. Returns the new inode number.

Source

pub fn sync_children(&mut self, parent_inode: u64, children: &[ChildInfo])

Replaces a directory’s children with what the device just reported, reusing the inode number of every child that’s still there under the same name and kind.

Inode numbers must survive a re-listing: the kernel caches them and open file descriptors refer to them, so handing out a fresh number for a file that didn’t go anywhere breaks reads on an already-open fd. Only the handle, size, and mtime are refreshed in place. Children the device no longer reports are removed.

Source

pub fn get(&self, inode: u64) -> Option<&InodeEntry>

Looks up an entry by inode number.

Source

pub fn get_mut(&mut self, inode: u64) -> Option<&mut InodeEntry>

Mutable lookup by inode number.

Source

pub fn lookup(&self, parent_inode: u64, name: &str) -> Option<u64>

Finds a child inode by parent inode and name.

Source

pub fn children(&self, parent_inode: u64) -> Vec<u64>

Returns the inodes of all children of the given parent.

Source

pub fn remove(&mut self, inode: u64) -> Option<InodeEntry>

Removes an entry and its index entries. Does not remove descendants.

Source

pub fn rename(&mut self, inode: u64, new_parent: u64, new_name: String)

Updates an entry’s parent and name (for rename/move operations).

Source

pub fn find_parent_by_handle(&self, handle: ObjectHandle) -> Option<u64>

Finds the parent inode of an entry identified by its MTP object handle. Returns None if the handle is not in the table.

Trait Implementations§

Source§

impl Debug for InodeTable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InodeTable

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.