// SPDX-License-Identifier: AGPL-3.0-or-later
use napi::{Error, Result, Status};
use napi_derive::napi;
#[cfg(target_os = "macos")]
use sysctl::{Ctl, CtlValue, Sysctl, SysctlError};
fn invalid_name_error(function_name: &str) -> Error {
Error::new(
Status::InvalidArg,
format!("{function_name} requires a non-empty name string"),
)
}
#[cfg(target_os = "macos")]
fn map_sysctl_error(error: SysctlError) -> Error {
match error {
SysctlError::IoError(ref io_error) => {
if let Some(errno) = io_error.raw_os_error() {
return Error::new(
Status::GenericFailure,
format!("sysctlbyname failed (errno {errno})"),
);
}
}
SysctlError::MissingImplementation
| SysctlError::ExtractionError
| SysctlError::ParseError
| SysctlError::InvalidCStr(_)
| SysctlError::InvalidCString(_) => {
return Error::new(
Status::GenericFailure,
"sysctlbyname failed (errno 22)".to_owned(),
);
}
SysctlError::NotFound(_)
| SysctlError::Utf8Error(_)
| SysctlError::NoReadAccess
| SysctlError::NoWriteAccess
| SysctlError::NotSupported
| SysctlError::ShortRead { .. } => {}
}
Error::new(
Status::GenericFailure,
format!("sysctlbyname failed ({error})"),
)
}
#[cfg(not(target_os = "macos"))]
fn unsupported_platform_error() -> Error {
Error::new(
Status::GenericFailure,
"sysctlbyname failed (errno 22)".to_owned(),
)
}
#[cfg(target_os = "macos")]
fn ctl_for_name(name: &str) -> Result