blob: b33fefd43c68d25c60a169b5eca8f1271cb8e16a [file] [log] [blame] [edit]
// 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
}};
}