summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bch_bindgen/src/opts.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/bch_bindgen/src/opts.rs b/bch_bindgen/src/opts.rs
index d38d469c..1ea927ff 100644
--- a/bch_bindgen/src/opts.rs
+++ b/bch_bindgen/src/opts.rs
@@ -1,3 +1,7 @@
+use crate::c;
+use crate::fs::Fs;
+use std::ffi::{CString, c_char};
+
#[macro_export]
macro_rules! opt_set {
($opts:ident, $n:ident, $v:expr) => {
@@ -33,3 +37,29 @@ macro_rules! opt_get {
}
};
}
+
+pub fn parse_mount_opts(fs: Option<&mut Fs>, optstr: Option<&str>, ignore_unknown: bool)
+ -> Result<c::bch_opts, c::bch_errcode> {
+ let mut opts: c::bch_opts = Default::default();
+
+ if let Some(optstr) = optstr {
+ let optstr = CString::new(optstr).unwrap();
+ let optstr_ptr = optstr.as_ptr();
+
+ let ret = unsafe {
+ c::bch2_parse_mount_opts(fs.map_or(std::ptr::null_mut(), |f| f.raw),
+ &mut opts as *mut c::bch_opts,
+ std::ptr::null_mut(),
+ optstr_ptr as *mut c_char,
+ ignore_unknown)
+ };
+
+ drop(optstr);
+
+ if ret != 0 {
+ let err: c::bch_errcode = unsafe { std::mem::transmute(-ret) };
+ return Err(err);
+ }
+ }
+ Ok(opts)
+}