diff --git a/Cargo.lock b/Cargo.lock index 58d81f58bd0..8f303864637 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4334,10 +4334,12 @@ version = "0.1.0" dependencies = [ "async-process", "crash-handler", + "futures 0.3.32", "log", "mach2 0.5.0", "minidumper", "parking_lot", + "paths", "serde", "serde_json", "system_specs", @@ -10502,9 +10504,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.22" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" dependencies = [ "cc", "libc", diff --git a/crates/crashes/Cargo.toml b/crates/crashes/Cargo.toml index f8b898112c1..8c3526f4c94 100644 --- a/crates/crashes/Cargo.toml +++ b/crates/crashes/Cargo.toml @@ -6,13 +6,17 @@ edition.workspace = true license = "GPL-3.0-or-later" [dependencies] -async-process.workspace = true -crash-handler.workspace = true +futures.workspace = true log.workspace = true -minidumper.workspace = true parking_lot.workspace = true serde.workspace = true serde_json.workspace = true + +[target.'cfg(not(target_os = "freebsd"))'.dependencies] +async-process.workspace = true +crash-handler.workspace = true +minidumper.workspace = true +paths.workspace = true system_specs.workspace = true zstd.workspace = true @@ -26,4 +30,4 @@ windows.workspace = true workspace = true [lib] -path = "src/crashes.rs" +path = "src/lib.rs" diff --git a/crates/crashes/src/crashes_freebsd.rs b/crates/crashes/src/crashes_freebsd.rs new file mode 100644 index 00000000000..907d26550df --- /dev/null +++ b/crates/crashes/src/crashes_freebsd.rs @@ -0,0 +1,33 @@ +use std::future::Future; +use std::path::Path; + +use futures::future::BoxFuture; +use serde::{Deserialize, Serialize}; + +pub static REQUESTED_MINIDUMP: std::sync::atomic::AtomicBool = + std::sync::atomic::AtomicBool::new(false); + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct InitCrashHandler { + pub session_id: String, + pub zed_version: String, + pub binary: String, + pub release_channel: String, + pub commit_sha: String, +} + +pub fn init + Send + Sync + 'static>( + _crash_init: InitCrashHandler, + _spawn: impl FnOnce(BoxFuture<'static, ()>), + _wait_timer: impl (Fn(std::time::Duration) -> F) + Send + Sync + 'static, +) { + log::info!("crash handler disabled on FreeBSD"); +} + +pub fn crash_server(_socket: &Path) { + log::info!("crash server disabled on FreeBSD"); +} + +pub fn set_gpu_info(_specs: ()) {} + +pub fn set_user_info(_info: ()) {} diff --git a/crates/crashes/src/lib.rs b/crates/crashes/src/lib.rs new file mode 100644 index 00000000000..4be5fafcdcb --- /dev/null +++ b/crates/crashes/src/lib.rs @@ -0,0 +1,11 @@ +#[cfg(not(target_os = "freebsd"))] +mod crashes; + +#[cfg(not(target_os = "freebsd"))] +pub use crashes::*; + +#[cfg(target_os = "freebsd")] +mod crashes_freebsd; + +#[cfg(target_os = "freebsd")] +pub use crashes_freebsd::*; diff --git a/crates/fs/src/fs.rs b/crates/fs/src/fs.rs index 7809e65eeb3..5d89ea7558c 100644 --- a/crates/fs/src/fs.rs +++ b/crates/fs/src/fs.rs @@ -451,14 +451,15 @@ impl FileHandle for std::fs::File { }; let fd = self.as_fd(); - let mut kif = MaybeUninit::::uninit(); + let mut kif = MaybeUninit::::zeroed(); + // SAFETY: zeroed memory is a valid initial state for kinfo_file. + let kif = unsafe { kif.assume_init_mut() }; kif.kf_structsize = libc::KINFO_FILE_SIZE; - let result = unsafe { libc::fcntl(fd.as_raw_fd(), libc::F_KINFO, kif.as_mut_ptr()) }; + let result = unsafe { libc::fcntl(fd.as_raw_fd(), libc::F_KINFO, kif as *mut _) }; anyhow::ensure!(result != -1, "fcntl returned -1"); - // SAFETY: `fcntl` will initialize the kif. - let c_str = unsafe { CStr::from_ptr(kif.assume_init().kf_path.as_ptr()) }; + let c_str = unsafe { CStr::from_ptr(kif.kf_path.as_ptr()) }; anyhow::ensure!(!c_str.is_empty(), "Could find a path for the file handle"); let path = PathBuf::from(OsStr::from_bytes(c_str.to_bytes())); Ok(path) diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index 12aeebfb956..f9e92867c08 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -35,7 +35,12 @@ mod platform; pub mod prelude; /// Profiling utilities for task timing and thread performance tracking. pub mod profiler; -#[cfg(any(target_os = "windows", target_os = "linux", target_family = "wasm"))] +#[cfg(any( + target_os = "windows", + target_os = "linux", + target_os = "freebsd", + target_family = "wasm" +))] #[expect(missing_docs)] pub mod queue; mod scene; @@ -107,7 +112,12 @@ pub use keymap::*; pub use path_builder::*; pub use platform::*; pub use profiler::*; -#[cfg(any(target_os = "windows", target_os = "linux", target_family = "wasm"))] +#[cfg(any( + target_os = "windows", + target_os = "linux", + target_os = "freebsd", + target_family = "wasm" +))] pub use queue::{PriorityQueueReceiver, PriorityQueueSender}; pub use refineable::*; pub use scene::*; diff --git a/crates/remote/src/remote_client.rs b/crates/remote/src/remote_client.rs index 993872b179f..bd95c14281b 100644 --- a/crates/remote/src/remote_client.rs +++ b/crates/remote/src/remote_client.rs @@ -57,6 +57,7 @@ pub enum RemoteOs { Linux, MacOs, Windows, + FreeBSD, } impl RemoteOs { @@ -65,6 +66,7 @@ impl RemoteOs { RemoteOs::Linux => "linux", RemoteOs::MacOs => "macos", RemoteOs::Windows => "windows", + RemoteOs::FreeBSD => "freebsd", } } diff --git a/crates/remote/src/transport.rs b/crates/remote/src/transport.rs index 1794a68839a..b307235b04d 100644 --- a/crates/remote/src/transport.rs +++ b/crates/remote/src/transport.rs @@ -32,6 +32,7 @@ fn parse_platform(output: &str) -> Result { let os = match os { "Darwin" => RemoteOs::MacOs, "Linux" => RemoteOs::Linux, + "FreeBSD" => RemoteOs::FreeBSD, _ => anyhow::bail!( "Prebuilt remote servers are not yet available for {os:?}. See https://zed.dev/docs/remote-development" ), @@ -244,6 +245,7 @@ async fn build_remote_server_from_source( "unknown-linux-gnu" }, RemoteOs::MacOs => "apple-darwin", + RemoteOs::FreeBSD => "unknown-freebsd", RemoteOs::Windows if cfg!(windows) => "pc-windows-msvc", RemoteOs::Windows => "pc-windows-gnu", } @@ -444,6 +446,10 @@ mod tests { assert!(parse_platform("Windows x86_64\n").is_err()); assert!(parse_platform("Linux armv7l\n").is_err()); + + let result = parse_platform("FreeBSD x86_64\n").unwrap(); + assert_eq!(result.os, RemoteOs::FreeBSD); + assert_eq!(result.arch, RemoteArch::X86_64); } #[test] diff --git a/crates/remote_server/Cargo.toml b/crates/remote_server/Cargo.toml index dcd22a9512a..f1ff4658488 100644 --- a/crates/remote_server/Cargo.toml +++ b/crates/remote_server/Cargo.toml @@ -75,11 +75,13 @@ thiserror.workspace = true rayon.workspace = true uuid = { workspace = true, features = ["v4"] } -[target.'cfg(not(windows))'.dependencies] +[target.'cfg(not(any(target_os = "windows", target_os = "freebsd")))'.dependencies] crash-handler.workspace = true +minidumper.workspace = true + +[target.'cfg(not(windows))'.dependencies] fork.workspace = true libc.workspace = true -minidumper.workspace = true [target.'cfg(windows)'.dependencies] windows.workspace = true