)
.await
}
+
+ /// Allow opening a directory at a specified offset.
+ pub async unsafe fn open_dir_at_end(&self, offset: u64) -> io::Result<DirectoryImpl<T>> {
+ DirectoryImpl::open_at_end(
+ self.input.clone(),
+ offset,
+ "/".into(),
+ Arc::clone(&self.caches),
+ )
+ .await
+ }
}
/// The directory random-access state machine implementation.
Ok(FileEntryImpl {
input: self.input.clone(),
entry,
- end_offset: self.end_offset(),
+ entry_range: self.entry_range(),
caches: Arc::clone(&self.caches),
})
}
pub(crate) struct FileEntryImpl<T: Clone + ReadAt> {
input: T,
entry: Entry,
- end_offset: u64,
+ entry_range: Range<u64>,
caches: Arc<Caches>,
}
DirectoryImpl::open_at_end(
self.input.clone(),
- self.end_offset,
+ self.entry_range.end,
self.entry.path.clone(),
Arc::clone(&self.caches),
)
pub fn entry(&self) -> &Entry {
&self.entry
}
+
+ /// Exposed for raw by-offset access methods (use with `open_dir_at_end`).
+ #[inline]
+ pub fn entry_range(&self) -> Range<u64> {
+ self.entry_range.clone()
+ }
}
/// An iterator over the contents of a directory.
}
async fn decode_entry(&self) -> io::Result<FileEntryImpl<T>> {
- let end_offset = self.entry_range.end;
let (entry, _decoder) = self
.dir
.decode_one_entry(self.entry_range.clone(), Some(&self.file_name))
Ok(FileEntryImpl {
input: self.dir.input.clone(),
entry,
- end_offset,
+ entry_range: self.entry_range(),
caches: Arc::clone(&self.caches),
})
}
+
+ /// Exposed for raw by-offset access methods.
+ #[inline]
+ pub fn entry_range(&self) -> Range<u64> {
+ self.entry_range.clone()
+ }
}
/// A reader for file contents.
//! Blocking `pxar` random access handling.
use std::io;
+use std::ops::Range;
use std::os::unix::fs::FileExt;
use std::path::Path;
use std::pin::Pin;
pub fn open_root(&self) -> io::Result<Directory<T>> {
Ok(Directory::new(poll_result_once(self.inner.open_root())?))
}
+
+ /// Allow opening a directory at a specified offset.
+ pub async unsafe fn open_dir_at_end(&self, offset: u64) -> io::Result<Directory<T>> {
+ Ok(Directory::new(poll_result_once(self.inner.open_dir_at_end(offset))?))
+ }
}
/// Adapter for FileExt readers.
pub fn entry(&self) -> &Entry {
&self.inner.entry()
}
+
+ /// Exposed for raw by-offset access methods (use with `open_dir_at_end`).
+ #[inline]
+ pub fn entry_range(&self) -> Range<u64> {
+ self.inner.entry_range()
+ }
}
impl<T: Clone + ReadAt> std::ops::Deref for FileEntry<T> {
pub fn decode_entry(&self) -> io::Result<FileEntry<T>> {
poll_result_once(self.inner.decode_entry()).map(|inner| FileEntry { inner })
}
+
+
+ /// Exposed for raw by-offset access methods.
+ #[inline]
+ pub fn entry_range(&self) -> Range<u64> {
+ self.inner.entry_range()
+ }
}
/// A reader for file contents.