| // Copyright 2019 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // panic_handler formats panic signatures on its own; this requires unstable features at the | |
| // moment. | |
| #![feature(panic_info_message)] | |
| #[cfg(feature = "chromeos-module")] | |
| pub mod chromeos; | |
| // Fallback dev-mode check if vboot_reference is not available. | |
| #[cfg(not(feature = "chromeos-module"))] | |
| pub mod chromeos { | |
| use std::fs::read_to_string; | |
| use std::io; | |
| use std::path::Path; | |
| use thiserror::Error as ThisError; | |
| #[derive(ThisError, Debug)] | |
| pub enum Error { | |
| #[error("failed to get kernel command line: {0}")] | |
| ReadError(io::Error), | |
| } | |
| pub type Result<R> = std::result::Result<R, Error>; | |
| pub fn is_dev_mode() -> Result<bool> { | |
| let contents = read_to_string(Path::new("/proc/cmdline")).map_err(Error::ReadError)?; | |
| Ok(contents.split(' ').any(|token| token == "cros_debug")) | |
| } | |
| } | |
| pub mod deprecated; | |
| pub mod disk; | |
| mod open_safely; | |
| mod open_safely_test; | |
| pub mod panic_handler; | |
| pub mod secure_blob; | |
| pub mod signal; | |
| pub mod syslog; | |
| use std::fs::File; | |
| use std::os::unix::io::FromRawFd; | |
| use nix::fcntl::OFlag; | |
| pub use crate::open_safely::{ | |
| open_at_safely, open_fifo_safely, open_safely, OpenSafelyError, OpenSafelyOptions, | |
| OpenSafelyResult, | |
| }; | |
| /// Spawns a pipe pair where the first pipe is the read end and the second pipe is the write end. | |
| /// | |
| /// If `close_on_exec` is true, the `O_CLOEXEC` flag will be set during pipe creation. | |
| pub fn pipe(close_on_exec: bool) -> nix::Result<(File, File)> { | |
| let flags = if close_on_exec { | |
| OFlag::O_CLOEXEC | |
| } else { | |
| OFlag::empty() | |
| }; | |
| // Safe because the file descriptors aren't owned yet. | |
| nix::unistd::pipe2(flags).map(|(a, b)| unsafe { (File::from_raw_fd(a), File::from_raw_fd(b)) }) | |
| } | |
| #[macro_export] | |
| macro_rules! handle_eintr_errno { | |
| ($x:expr) => {{ | |
| use libc::EINTR; | |
| use nix::errno::errno; | |
| let mut res; | |
| loop { | |
| res = $x; | |
| if res != -1 || errno() != EINTR { | |
| break; | |
| } | |
| } | |
| res | |
| }}; | |
| } |