aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs47
1 files changed, 26 insertions, 21 deletions
diff --git a/src/lib.rs b/src/lib.rs
index bd975e0..5769b54 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,11 +1,12 @@
+#[macro_use] extern crate lazy_static;
extern crate libc;
extern crate mmap;
extern crate num_derive;
extern crate num_traits;
extern crate owning_ref;
extern crate walkdir;
+extern crate xattr;
-// TODO Use AsRef<Path> rather than Path for public interfaces
use std::mem::MaybeUninit;
use std::ffi::{OsStr, OsString};
use std::path::PathBuf;
@@ -26,6 +27,8 @@ mod bindings {
pub mod read;
pub mod write;
+type BoxedError = Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>;
+
#[derive(Error, Debug, FromPrimitive)]
#[repr(i32)]
pub enum LibError {
@@ -68,6 +71,9 @@ pub enum SquashfsError {
#[error("Memory mapping failed: {0}")] Mmap(#[from] mmap::MapError),
#[error("Couldn't get the current system time: {0}")] Time(#[from] std::time::SystemTimeError),
#[error("Refusing to create empty archive")] Empty,
+ #[error("Tried to write directory {0} before child {1}")] WriteOrder(u32, u32),
+ #[error("Tried to write unknown or unsupported file type")] WriteType(std::fs::FileType),
+ #[error("Callback returned an error")] WrappedError(BoxedError),
}
type Result<T> = std::result::Result<T, SquashfsError>;
@@ -82,26 +88,6 @@ fn sfs_check(code: i32, desc: &str) -> Result<i32> {
}
}
-// TODO Make these three funtions return ManagedPointer rather than requiring the caller to do the wrappning
-fn sfs_init<T>(init: &dyn Fn(*mut T) -> i32, err: &str) -> Result<T> {
- let mut ret: MaybeUninit<T> = MaybeUninit::uninit();
- sfs_check(init(ret.as_mut_ptr()), err)?;
- Ok(unsafe { ret.assume_init() })
-}
-
-fn sfs_init_ptr<T>(init: &dyn Fn(*mut *mut T) -> i32, err: &str) -> Result<*mut T> {
- let mut ret: *mut T = ptr::null_mut();
- sfs_check(init(&mut ret), err)?;
- if ret.is_null() { Err(SquashfsError::LibraryReturnError(err.to_string())) }
- else { Ok(ret) }
-}
-
-fn sfs_init_check_null<T>(init: &dyn Fn() -> *mut T, err: &str) -> Result<*mut T> {
- let ret = init();
- if ret.is_null() { Err(SquashfsError::LibraryNullError(err.to_string())) }
- else { Ok(ret) }
-}
-
fn sfs_destroy<T>(x: *mut T) {
unsafe {
let obj = x as *mut sqfs_object_t;
@@ -175,3 +161,22 @@ impl<T> std::fmt::Debug for ManagedPointer<T> {
write!(f, "ManagedPointer({:?})", self.ptr)
}
}
+
+fn sfs_init<T>(init: &dyn Fn(*mut T) -> i32, err: &str) -> Result<T> {
+ let mut ret: MaybeUninit<T> = MaybeUninit::uninit();
+ sfs_check(init(ret.as_mut_ptr()), err)?;
+ Ok(unsafe { ret.assume_init() })
+}
+
+fn sfs_init_ptr<T>(init: &dyn Fn(*mut *mut T) -> i32, err: &str, destroy: fn(*mut T)) -> Result<ManagedPointer<T>> {
+ let mut ret: *mut T = ptr::null_mut();
+ sfs_check(init(&mut ret), err)?;
+ if ret.is_null() { Err(SquashfsError::LibraryReturnError(err.to_string())) }
+ else { Ok(ManagedPointer::new(ret, destroy)) }
+}
+
+fn sfs_init_check_null<T>(init: &dyn Fn() -> *mut T, err: &str, destroy: fn(*mut T)) -> Result<ManagedPointer<T>> {
+ let ret = init();
+ if ret.is_null() { Err(SquashfsError::LibraryNullError(err.to_string())) }
+ else { Ok(ManagedPointer::new(ret, destroy)) }
+}