diff --git a/Cargo.toml b/Cargo.toml
index 80d3362..a2d1d45 100644
@@ -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
@@ -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
@@ -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(),