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