aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/error.rs
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2016-11-05 20:06:50 -0700
committerSteven Fackler <[email protected]>2016-11-05 20:06:50 -0700
commita0b56c437803a08413755928040a0970a93a7b83 (patch)
tree0f21848301b62d6078eafaee10e513df4163087b /openssl/src/error.rs
parentMerge branch 'release-v0.8.3' into release (diff)
parentRelease v0.9.0 (diff)
downloadrust-openssl-0.9.0.tar.xz
rust-openssl-0.9.0.zip
Merge branch 'release-v0.9.0' into releasev0.9.0
Diffstat (limited to 'openssl/src/error.rs')
-rw-r--r--openssl/src/error.rs95
1 files changed, 55 insertions, 40 deletions
diff --git a/openssl/src/error.rs b/openssl/src/error.rs
index d76e7cbd..4dd219af 100644
--- a/openssl/src/error.rs
+++ b/openssl/src/error.rs
@@ -71,44 +71,84 @@ impl Error {
match unsafe { ffi::ERR_get_error() } {
0 => None,
- err => Some((Error(err))),
+ err => Some(Error(err)),
}
}
/// Returns the raw OpenSSL error code for this error.
- pub fn error_code(&self) -> c_ulong {
+ pub fn code(&self) -> c_ulong {
self.0
}
- /// Returns the name of the library reporting the error.
- pub fn library(&self) -> &'static str {
- get_lib(self.0)
+ /// Returns the name of the library reporting the error, if available.
+ pub fn library(&self) -> Option<&'static str> {
+ unsafe {
+ let cstr = ffi::ERR_lib_error_string(self.0);
+ if cstr.is_null() {
+ return None;
+ }
+ let bytes = CStr::from_ptr(cstr as *const _).to_bytes();
+ Some(str::from_utf8(bytes).unwrap())
+ }
}
/// Returns the name of the function reporting the error.
- pub fn function(&self) -> &'static str {
- get_func(self.0)
+ pub fn function(&self) -> Option<&'static str> {
+ unsafe {
+ let cstr = ffi::ERR_func_error_string(self.0);
+ if cstr.is_null() {
+ return None;
+ }
+ let bytes = CStr::from_ptr(cstr as *const _).to_bytes();
+ Some(str::from_utf8(bytes).unwrap())
+ }
}
/// Returns the reason for the error.
- pub fn reason(&self) -> &'static str {
- get_reason(self.0)
+ pub fn reason(&self) -> Option<&'static str> {
+ unsafe {
+ let cstr = ffi::ERR_reason_error_string(self.0);
+ if cstr.is_null() {
+ return None;
+ }
+ let bytes = CStr::from_ptr(cstr as *const _).to_bytes();
+ Some(str::from_utf8(bytes).unwrap())
+ }
}
}
impl fmt::Debug for Error {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
- fmt.debug_struct("Error")
- .field("library", &self.library())
- .field("function", &self.function())
- .field("reason", &self.reason())
- .finish()
+ let mut builder = fmt.debug_struct("Error");
+ builder.field("code", &self.code());
+ if let Some(library) = self.library() {
+ builder.field("library", &library);
+ }
+ if let Some(function) = self.function() {
+ builder.field("function", &function);
+ }
+ if let Some(reason) = self.reason() {
+ builder.field("reason", &reason);
+ }
+ builder.finish()
}
}
impl fmt::Display for Error {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
- fmt.write_str(&self.reason())
+ try!(write!(fmt, "error:{:08X}", self.0));
+ match self.library() {
+ Some(l) => try!(write!(fmt, ":{}", l)),
+ None => try!(write!(fmt, ":lib({})", ffi::ERR_GET_LIB(self.0))),
+ }
+ match self.function() {
+ Some(f) => try!(write!(fmt, ":{}", f)),
+ None => try!(write!(fmt, ":func({})", ffi::ERR_GET_FUNC(self.0))),
+ }
+ match self.reason() {
+ Some(r) => write!(fmt, ":{}", r),
+ None => write!(fmt, ":reason({})", ffi::ERR_GET_FUNC(self.0)),
+ }
}
}
@@ -117,28 +157,3 @@ impl error::Error for Error {
"An OpenSSL error"
}
}
-
-fn get_lib(err: c_ulong) -> &'static str {
- unsafe {
- let cstr = ffi::ERR_lib_error_string(err);
- let bytes = CStr::from_ptr(cstr as *const _).to_bytes();
- str::from_utf8(bytes).unwrap()
- }
-}
-
-fn get_func(err: c_ulong) -> &'static str {
- unsafe {
- let cstr = ffi::ERR_func_error_string(err);
- let bytes = CStr::from_ptr(cstr as *const _).to_bytes();
- str::from_utf8(bytes).unwrap()
- }
-}
-
-fn get_reason(err: c_ulong) -> &'static str {
- unsafe {
- let cstr = ffi::ERR_reason_error_string(err);
- let bytes = CStr::from_ptr(cstr as *const _).to_bytes();
- str::from_utf8(bytes).unwrap()
- }
-}
-