fuse-backend-rs 0.9.4

A rust library for Fuse(filesystem in userspace) servers and virtio-fs devices
Documentation
diff --git a/Cargo.toml b/Cargo.toml
index 80d3362..a2d1d45 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,6 +14,7 @@ license = "Apache-2.0 AND BSD-3-Clause"
 edition = "2018"
 repository = "https://github.com/cloud-hypervisor/fuse-backend-rs"
 homepage = "https://github.com/cloud-hypervisor/"
+build = "build.rs"
 
 [dependencies]
 arc-swap = ">=0.4.6"
@@ -23,7 +24,7 @@ bitflags = "1.1"
 #iou = { version = "0.3.3", optional = true }
 libc = "0.2.68"
 log = "0.4.6"
-nix = "0.23"
+nix = ">=0.23"
 lazy_static = "1.4"
 #ringbahn = { version = "0.0.0-experimental.3", optional = true }
 vmm-sys-util = { version = "0.9", optional = true }
@@ -33,8 +34,7 @@ vhost = { version = "0.3", features = ["vhost-user-slave"], optional = true }
 mio = { version = "0.8", features = ["os-poll", "os-ext"]}
 
 [target.'cfg(target_os = "macos")'.dependencies]
-core-foundation-sys = { version = "0.2.3", optional = true }
-diskarbitration-sys = { version = "0.0.4", optional = true }
+core-foundation-sys = { version = ">=0.8", optional = true }
 
 [target.'cfg(target_os = "linux")'.dependencies]
 caps = { version = "0.3", optional = true }
@@ -48,7 +48,7 @@ vm-memory = { version = "0.7", features = ["backend-mmap", "backend-bitmap"] }
 [features]
 default = ["fusedev"]
 #async-io = ["async-trait", "futures", "iou", "ringbahn", "caps]
-fusedev = ["vmm-sys-util", "caps", "core-foundation-sys", "diskarbitration-sys"]
+fusedev = ["vmm-sys-util", "caps", "core-foundation-sys"]
 virtiofs = ["virtio-queue", "caps"]
 vhost-user-fs = ["virtiofs", "vhost", "caps"]
 
diff --git a/src/transport/fusedev/macos_session.rs b/src/transport/fusedev/macos_session.rs
index 92a9f2d..590fa4b 100644
--- a/src/transport/fusedev/macos_session.rs
+++ b/src/transport/fusedev/macos_session.rs
@@ -8,12 +8,9 @@
 //! sequentially. A FUSE session is a connection from a FUSE mountpoint to a FUSE server daemon.
 //! A FUSE session can have multiple FUSE channels so that FUSE requests are handled in parallel.
 
-use core_foundation_sys::base::{CFIndex, CFRelease};
+use core_foundation_sys::base::{CFAllocatorRef, CFIndex, CFRelease};
 use core_foundation_sys::string::{kCFStringEncodingUTF8, CFStringCreateWithBytes};
-use core_foundation_sys::url::{kCFURLPOSIXPathStyle, CFURLCreateWithFileSystemPath};
-use diskarbitration_sys::base::{kDADiskUnmountOptionForce, DADiskUnmount};
-use diskarbitration_sys::disk::{DADiskCreateFromVolumePath, DADiskRef};
-use diskarbitration_sys::session::{DASessionCreate, DASessionRef};
+use core_foundation_sys::url::{kCFURLPOSIXPathStyle, CFURLCreateWithFileSystemPath, CFURLRef};
 use std::ffi::CString;
 use std::fs::File;
 use std::os::unix::ffi::OsStrExt;
@@ -42,6 +39,37 @@ const FUSE_HEADER_SIZE: usize = 0x1000;
 
 const OSXFUSE_MOUNT_PROG: &str = "/Library/Filesystems/macfuse.fs/Contents/Resources/mount_macfuse";
 
+static K_DADISK_UNMOUNT_OPTION_FORCE: u64 = 524288;
+
+#[repr(C)]
+struct __DADisk(c_void);
+type DADiskRef = *const __DADisk;
+#[repr(C)]
+struct __DADissenter(c_void);
+type DADissenterRef = *const __DADissenter;
+#[repr(C)]
+struct __DASession(c_void);
+type DASessionRef = *const __DASession;
+
+type DADiskUnmountCallback = ::std::option::Option<
+    unsafe extern "C" fn(disk: DADiskRef, dissenter: DADissenterRef, context: *mut c_void),
+>;
+
+extern "C" {
+    fn DADiskUnmount(
+        disk: DADiskRef,
+        options: u64,
+        callback: DADiskUnmountCallback,
+        context: *mut c_void,
+    );
+    fn DADiskCreateFromVolumePath(
+        allocator: CFAllocatorRef,
+        session: DASessionRef,
+        path: CFURLRef,
+    ) -> DADiskRef;
+    fn DASessionCreate(allocator: CFAllocatorRef) -> DASessionRef;
+}
+
 mod ioctl {
     use nix::ioctl_write_ptr;
 
@@ -362,7 +390,6 @@ fn create_disk(mountpoint: &Path, dasession: DASessionRef) -> DADiskRef {
             path_len as CFIndex,
             kCFStringEncodingUTF8,
             1u8,
-            std::ptr::null(),
         );
         let url =
             CFURLCreateWithFileSystemPath(std::ptr::null(), url_str, kCFURLPOSIXPathStyle, 1u8);
@@ -385,7 +412,12 @@ fn fuse_kern_umount(file: File, disk: Option<DADiskRef>) -> Result<()> {
 
     if let Some(disk) = disk {
         unsafe {
-            DADiskUnmount(disk, kDADiskUnmountOptionForce, None, std::ptr::null_mut());
+            DADiskUnmount(
+                disk,
+                K_DADISK_UNMOUNT_OPTION_FORCE,
+                None,
+                std::ptr::null_mut(),
+            );
             CFRelease(std::mem::transmute(disk));
         }
     }
diff --git a/tests/example/macfuse.rs b/tests/example/macfuse.rs
index 924f527..a491fb3 100644
--- a/tests/example/macfuse.rs
+++ b/tests/example/macfuse.rs
@@ -287,7 +287,9 @@ impl Daemon {
     pub fn mount(&mut self) -> Result<()> {
         let mut se =
             FuseSession::new(Path::new(&self.mountpoint), "passthru_example", "", true).unwrap();
-        se.mount().unwrap();
+        if let Err(e) = se.mount() {
+            panic!("failed to mount fuse session, {}", e);
+        }
         for _ in 0..self.thread_cnt {
             let mut server = FuseServer {
                 server: self.server.clone(),