use std::fs::File;
use std::io::{Error, ErrorKind, Write};
use std::process::Command;
use super::not_implemented;
use super::ShutdownResult;
fn invoke_script(script: &str) -> ShutdownResult {
let mut cmd = Command::new("osascript");
cmd.args(&["-e", script]);
match cmd.output() {
Ok(output) => {
if output.status.success() && output.stderr.is_empty() {
return Ok(());
}
Err(Error::new(
ErrorKind::Other,
String::from_utf8(output.stderr).unwrap(),
))
}
Err(error) => Err(error),
}
}
pub fn request_permission_dialog() -> ShutdownResult {
invoke_script("tell application \"System Events\" to stop current screen saver")
}
pub fn shutdown() -> ShutdownResult {
invoke_script("tell application \"System Events\" to shut down")
}
#[doc(hidden)]
pub fn force_shutdown() -> ShutdownResult {
not_implemented!()
}
pub fn reboot() -> ShutdownResult {
invoke_script("tell application \"System Events\" to restart")
}
pub fn force_reboot() -> ShutdownResult {
let mut file = File::create("/proc/sys/kernel/sysrq")?;
file.write_all(b"128")?;
file = File::create("/proc/sysrq-trigger")?;
file.write_all(b"b")?;
Ok(())
}
pub fn logout() -> ShutdownResult {
invoke_script("tell application \"System Events\" to log out")
}
pub fn force_logout() -> ShutdownResult {
invoke_script("tell application \"loginwindow\" to «event aevtrlgo»")
}
pub fn sleep() -> ShutdownResult {
invoke_script("tell application \"System Events\" to sleep")
}
#[doc(hidden)]
pub fn hibernate() -> ShutdownResult {
not_implemented!()
}