// Copyright 2017 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. use std::fmt::{self, Display}; use std::io; use std::result; use libc::__errno_location; /// An error number, retrieved from errno (man 3 errno), set by a libc /// function that returned an error. #[derive(Clone, Copy, Debug, PartialEq)] pub struct Error(i32); pub type Result = result::Result; impl Error { /// Constructs a new error with the given errno. pub fn new(e: i32) -> Error { Error(e) } /// Constructs an error from the current errno. /// /// The result of this only has any meaning just after a libc call that returned a value /// indicating errno was set. pub fn last() -> Error { Error(unsafe { *__errno_location() }) } /// Gets the errno for this error pub fn errno(self) -> i32 { self.0 } } impl From for Error { fn from(e: io::Error) -> Self { Error::new(e.raw_os_error().unwrap_or_default()) } } impl From for io::Error { fn from(e: Error) -> io::Error { io::Error::from_raw_os_error(e.0) } } impl std::error::Error for Error {} impl Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { Into::::into(*self).fmt(f) } } /// Returns the last errno as a Result that is always an error. pub fn errno_result() -> Result { Err(Error::last()) } /// Sets errno to given error code. /// Only defined when we compile tests as normal code does not /// normally need set errno. #[cfg(test)] pub fn set_errno(e: i32) { unsafe { *__errno_location() = e; } }