#![cfg(target_os = "macos")]
pub(super) fn probe_version() -> String {
let name = b"kern.osproductversion\0";
let mut size: libc::size_t = 0;
let rc = unsafe {
libc::sysctlbyname(
name.as_ptr().cast::<libc::c_char>(),
std::ptr::null_mut(),
&mut size,
std::ptr::null_mut(),
0,
)
};
if rc != 0 || size == 0 {
return "unknown".to_string();
}
if size > 64 {
return "unknown".to_string();
}
let mut buf: Vec<u8> = vec![0u8; size];
let rc = unsafe {
libc::sysctlbyname(
name.as_ptr().cast::<libc::c_char>(),
buf.as_mut_ptr().cast::<libc::c_void>(),
&mut size,
std::ptr::null_mut(),
0,
)
};
if rc != 0 {
return "unknown".to_string();
}
if let Some(&0) = buf.last() {
let _ = buf.pop();
}
match String::from_utf8(buf) {
Ok(s) if !s.is_empty() => s,
_ => "unknown".to_string(),
}
}
pub(super) fn probe_distro() -> Option<String> {
None
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_probe_version_returns_non_empty_default() {
assert!(!probe_version().is_empty());
}
#[test]
fn test_probe_version_returns_real_version_or_unknown() {
let v = probe_version();
assert!(!v.is_empty());
if v != "unknown" {
let first = v.chars().next().unwrap();
assert!(
first.is_ascii_digit(),
"expected version to start with a digit, got {:?}",
v
);
}
}
#[test]
fn test_probe_distro_returns_none() {
assert!(probe_distro().is_none());
}
}