diff options
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | src/error.rs | 28 | 
2 files changed, 28 insertions, 2 deletions
| diff --git a/CHANGELOG.md b/CHANGELOG.md index 7623a33..046b609 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,8 @@ SPDX-License-Identifier: MIT  - Update the `nitrokey-sys` dependency to version 3.5.0.  - Update the `nitrokey-test` dependency to version 0.2.1 and add the    `nitrokey-test-state` dependency in version 0.1.0. +- Refactor connection management: +  - Add `ConcurrentAccessError` and `PoisonError` `Error` variants.  # v0.3.4 (2019-01-20)  - Fix authentication methods that assumed that `char` is signed. diff --git a/src/error.rs b/src/error.rs index 1730171..c6b19db 100644 --- a/src/error.rs +++ b/src/error.rs @@ -5,6 +5,7 @@ use std::error;  use std::fmt;  use std::os::raw;  use std::str; +use std::sync;  use crate::device; @@ -13,11 +14,15 @@ use crate::device;  pub enum Error {      /// An error reported by the Nitrokey device in the response packet.      CommandError(CommandError), -    /// A device communication. +    /// A device communication error.      CommunicationError(CommunicationError), +    /// An error occurred due to concurrent access to the Nitrokey device. +    ConcurrentAccessError,      /// A library usage error.      LibraryError(LibraryError), -    /// An error that occured during random number generation. +    /// An error that occurred due to a poisoned lock. +    PoisonError, +    /// An error that occurred during random number generation.      RandError(Box<dyn error::Error>),      /// An error that is caused by an unexpected value returned by libnitrokey.      UnexpectedError, @@ -65,6 +70,21 @@ impl From<str::Utf8Error> for Error {      }  } +impl<T> From<sync::PoisonError<T>> for Error { +    fn from(_error: sync::PoisonError<T>) -> Self { +        Error::PoisonError +    } +} + +impl<T> From<sync::TryLockError<T>> for Error { +    fn from(error: sync::TryLockError<T>) -> Self { +        match error { +            sync::TryLockError::Poisoned(err) => err.into(), +            sync::TryLockError::WouldBlock => Error::ConcurrentAccessError, +        } +    } +} +  impl<T: device::Device> From<(T, Error)> for Error {      fn from((_, err): (T, Error)) -> Self {          err @@ -76,7 +96,9 @@ impl error::Error for Error {          match *self {              Error::CommandError(ref err) => Some(err),              Error::CommunicationError(ref err) => Some(err), +            Error::ConcurrentAccessError => None,              Error::LibraryError(ref err) => Some(err), +            Error::PoisonError => None,              Error::RandError(ref err) => Some(err.as_ref()),              Error::UnexpectedError => None,              Error::UnknownError(_) => None, @@ -90,7 +112,9 @@ impl fmt::Display for Error {          match *self {              Error::CommandError(ref err) => write!(f, "Command error: {}", err),              Error::CommunicationError(ref err) => write!(f, "Communication error: {}", err), +            Error::ConcurrentAccessError => write!(f, "Internal error: concurrent access"),              Error::LibraryError(ref err) => write!(f, "Library error: {}", err), +            Error::PoisonError => write!(f, "Internal error: poisoned lock"),              Error::RandError(ref err) => write!(f, "RNG error: {}", err),              Error::UnexpectedError => write!(f, "An unexpected error occurred"),              Error::UnknownError(ref err) => write!(f, "Unknown error: {}", err), | 
