| // 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. | |
| // Re-export for CrOS. | |
| pub use crosvm_base as sys; | |
| pub use crosvm_base::unix::panic_handler; | |
| // Exports dependencies which are locked to `crosvm_base` versions. This allows us to have a single | |
| // point of declaration for these, rather than N. | |
| pub mod sys_deps { | |
| pub use zerocopy; | |
| } | |
| #[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 rand; | |
| pub mod scoped_path; | |
| pub mod secure_blob; | |
| pub mod syslog; | |
| use std::os::unix::io::FromRawFd; | |
| use std::os::unix::net::UnixDatagram; | |
| use libc::{socketpair, AF_UNIX, FIOCLEX, SOCK_SEQPACKET}; | |
| use sys::unix::ioctl; | |
| pub fn new_seqpacket_pair() -> sys::Result<(UnixDatagram, UnixDatagram)> { | |
| let mut fds = [0, 0]; | |
| // Safe because fds is owned and the return value is checked. | |
| let ret = unsafe { socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds.as_mut_ptr()) }; | |
| if ret != 0 { | |
| return Err(sys::Error::last()); | |
| } | |
| // Safe because the file descriptors aren't owned yet. | |
| let first = unsafe { UnixDatagram::from_raw_fd(fds[0]) }; | |
| let second = unsafe { UnixDatagram::from_raw_fd(fds[1]) }; | |
| // Set FD_CLOEXEC. Safe because this will not fail since the fds are valid. | |
| unsafe { | |
| ioctl(&first, FIOCLEX); | |
| ioctl(&second, FIOCLEX); | |
| } | |
| Ok((first, second)) | |
| } |