13da5c369Sopenharmony_ci//! Reboot/shutdown or enable/disable Ctrl-Alt-Delete. 23da5c369Sopenharmony_ci 33da5c369Sopenharmony_ciuse crate::errno::Errno; 43da5c369Sopenharmony_ciuse crate::Result; 53da5c369Sopenharmony_ciuse std::convert::Infallible; 63da5c369Sopenharmony_ciuse std::mem::drop; 73da5c369Sopenharmony_ci 83da5c369Sopenharmony_cilibc_enum! { 93da5c369Sopenharmony_ci /// How exactly should the system be rebooted. 103da5c369Sopenharmony_ci /// 113da5c369Sopenharmony_ci /// See [`set_cad_enabled()`](fn.set_cad_enabled.html) for 123da5c369Sopenharmony_ci /// enabling/disabling Ctrl-Alt-Delete. 133da5c369Sopenharmony_ci #[repr(i32)] 143da5c369Sopenharmony_ci #[non_exhaustive] 153da5c369Sopenharmony_ci pub enum RebootMode { 163da5c369Sopenharmony_ci /// Halt the system. 173da5c369Sopenharmony_ci RB_HALT_SYSTEM, 183da5c369Sopenharmony_ci /// Execute a kernel that has been loaded earlier with 193da5c369Sopenharmony_ci /// [`kexec_load(2)`](https://man7.org/linux/man-pages/man2/kexec_load.2.html). 203da5c369Sopenharmony_ci RB_KEXEC, 213da5c369Sopenharmony_ci /// Stop the system and switch off power, if possible. 223da5c369Sopenharmony_ci RB_POWER_OFF, 233da5c369Sopenharmony_ci /// Restart the system. 243da5c369Sopenharmony_ci RB_AUTOBOOT, 253da5c369Sopenharmony_ci // we do not support Restart2. 263da5c369Sopenharmony_ci /// Suspend the system using software suspend. 273da5c369Sopenharmony_ci RB_SW_SUSPEND, 283da5c369Sopenharmony_ci } 293da5c369Sopenharmony_ci} 303da5c369Sopenharmony_ci 313da5c369Sopenharmony_ci/// Reboots or shuts down the system. 323da5c369Sopenharmony_cipub fn reboot(how: RebootMode) -> Result<Infallible> { 333da5c369Sopenharmony_ci unsafe { libc::reboot(how as libc::c_int) }; 343da5c369Sopenharmony_ci Err(Errno::last()) 353da5c369Sopenharmony_ci} 363da5c369Sopenharmony_ci 373da5c369Sopenharmony_ci/// Enable or disable the reboot keystroke (Ctrl-Alt-Delete). 383da5c369Sopenharmony_ci/// 393da5c369Sopenharmony_ci/// Corresponds to calling `reboot(RB_ENABLE_CAD)` or `reboot(RB_DISABLE_CAD)` in C. 403da5c369Sopenharmony_cipub fn set_cad_enabled(enable: bool) -> Result<()> { 413da5c369Sopenharmony_ci let cmd = if enable { 423da5c369Sopenharmony_ci libc::RB_ENABLE_CAD 433da5c369Sopenharmony_ci } else { 443da5c369Sopenharmony_ci libc::RB_DISABLE_CAD 453da5c369Sopenharmony_ci }; 463da5c369Sopenharmony_ci let res = unsafe { libc::reboot(cmd) }; 473da5c369Sopenharmony_ci Errno::result(res).map(drop) 483da5c369Sopenharmony_ci} 49