From ae5f02d2e90a69686ba8f0e77f7938b3a229c4cf Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 22 Apr 2021 15:40:39 -0700 Subject: [PATCH] Use getmntinfo(3) to list mounted volumes Co-Authored-By: Nathan Sobo --- Cargo.lock | 2 -- zed/Cargo.toml | 4 ---- zed/src/worktree.rs | 39 +++++++++++++++------------------------ 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c6a91422adbf3c368b9988a94d60cdda6c67054f..b8b7d9ad22f080d3e54ffb0fdefc0395b3813b5b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2220,7 +2220,6 @@ version = "0.1.0" dependencies = [ "anyhow", "arrayvec", - "cocoa", "crossbeam-channel", "ctor", "dirs", @@ -2234,7 +2233,6 @@ dependencies = [ "libc", "log", "num_cpus", - "objc", "parking_lot", "postage", "rand 0.8.3", diff --git a/zed/Cargo.toml b/zed/Cargo.toml index 0ab9b2495ce00b2d1d93c3ece5afff621b0bb25e..c38db66d0f69294d25a86629e83111eee9d16dba 100644 --- a/zed/Cargo.toml +++ b/zed/Cargo.toml @@ -42,7 +42,3 @@ env_logger = "0.8" serde_json = {version = "1.0.64", features = ["preserve_order"]} tempdir = "0.3.7" unindent = "0.1.7" - -[target.'cfg(target_os = "macos")'.dependencies] -cocoa = "0.24" -objc = "0.2" diff --git a/zed/src/worktree.rs b/zed/src/worktree.rs index bd2de1cfdda95bf9ae8d7aeb84cfc069f1c23636..395d8683834f2975bb6542c986bd20c6020ec312 100644 --- a/zed/src/worktree.rs +++ b/zed/src/worktree.rs @@ -18,13 +18,13 @@ use postage::{ use smol::{channel::Sender, Timer}; use std::{ collections::{BTreeMap, HashMap, HashSet}, - ffi::OsStr, + ffi::{CStr, OsStr}, fmt, fs, future::Future, io::{self, Read, Write}, mem, ops::{AddAssign, Deref}, - os::unix::fs::MetadataExt, + os::unix::{ffi::OsStrExt, fs::MetadataExt}, path::{Path, PathBuf}, sync::Arc, time::Duration, @@ -1229,30 +1229,21 @@ impl<'a> Iterator for FileIter<'a> { } fn mounted_volume_paths() -> Vec { - use cocoa::{ - base::{id, nil}, - foundation::{NSArray, NSString, NSURL}, - }; - use objc::{class, msg_send, sel, sel_impl}; - unsafe { - let manager: id = msg_send![class!(NSFileManager), defaultManager]; - let array = NSArray::array(nil); - let urls: id = - msg_send![manager, mountedVolumeURLsIncludingResourceValuesForKeys:array options:0]; - let len = urls.count() as usize; - let mut result = Vec::with_capacity(len); - for i in 0..len { - let url = urls.objectAtIndex(i as u64); - let string = url.absoluteString(); - let string = std::ffi::CStr::from_ptr(string.UTF8String()) - .to_string_lossy() - .to_string(); - if let Some(path) = string.strip_prefix("file://") { - result.push(PathBuf::from(path)); + let mut stat_ptr: *mut libc::statfs = std::ptr::null_mut(); + let count = libc::getmntinfo(&mut stat_ptr as *mut _, libc::MNT_WAIT); + if count >= 0 { + std::slice::from_raw_parts(stat_ptr, count as usize) + .iter() + .map(|stat| { + PathBuf::from(OsStr::from_bytes( + CStr::from_ptr(&stat.f_mntonname[0]).to_bytes(), + )) + }) + .collect() + } else { + panic!("failed to run getmntinfo"); } - } - result } }