summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2025-03-25 14:09:16 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2025-03-25 16:37:26 -0400
commit18b4914587e4338ad04e9d4996a169b639ffe506 (patch)
tree14ef63561f6bf59eea8886a6fa0146ff6f98136d
parent8af5c93e488481d58f85364278e6037ce354eccc (diff)
rust binding for parse_mount_opts()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-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)
+}