diff --git a/src/ffi.rs b/src/ffi.rs index 2118391b02e2481bb466ff65022e9c0c8da5b6fe..42d33c8791a19c2e7f7b30f6b0e8e22f863f8f12 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -272,6 +272,10 @@ extern "C" { pub fn ERR_get_error() -> c_ulong; + pub fn ERR_lib_error_string(err: c_ulong) -> *const c_char; + pub fn ERR_func_error_string(err: c_ulong) -> *const c_char; + pub fn ERR_reason_error_string(err: c_ulong) -> *const c_char; + pub fn EVP_md5() -> *const EVP_MD; pub fn EVP_ripemd160() -> *const EVP_MD; pub fn EVP_sha1() -> *const EVP_MD; @@ -345,6 +349,8 @@ extern "C" { pub fn SSL_library_init() -> c_int; + pub fn SSL_load_error_strings(); + #[cfg(feature = "sslv2")] pub fn SSLv2_method() -> *const SSL_METHOD; pub fn SSLv3_method() -> *const SSL_METHOD; diff --git a/src/ssl/error.rs b/src/ssl/error.rs index 452f8aad8716c8697d6a1be2dc46409fb4278acb..b7688595f2e90d42789600ce8e70e31e775a46e7 100644 --- a/src/ssl/error.rs +++ b/src/ssl/error.rs @@ -1,5 +1,6 @@ use libc::c_ulong; use std::io::IoError; +use std::c_str::CString; use ffi; @@ -20,24 +21,24 @@ pub enum OpensslError { /// An unknown error UnknownError { /// The library reporting the error - library: u8, + library: CString, /// The function reporting the error - function: u16, + function: CString, /// The reason for the error - reason: u16 + reason: CString } } -fn get_lib(err: c_ulong) -> u8 { - ((err >> 24) & 0xff) as u8 +fn get_lib(err: c_ulong) -> CString { + unsafe { CString::new(ffi::ERR_lib_error_string(err), false) } } -fn get_func(err: c_ulong) -> u16 { - ((err >> 12) & 0xfff) as u16 +fn get_func(err: c_ulong) -> CString { + unsafe { CString::new(ffi::ERR_func_error_string(err), false) } } -fn get_reason(err: c_ulong) -> u16 { - (err & 0xfff) as u16 +fn get_reason(err: c_ulong) -> CString { + unsafe { CString::new(ffi::ERR_reason_error_string(err), false) } } impl SslError { diff --git a/src/ssl/mod.rs b/src/ssl/mod.rs index 379a98cf46e6134e3f3367f2ccad3e67c2c75595..b5027e8f9ec05739f2e7db9630c70bd0f60330fc 100644 --- a/src/ssl/mod.rs +++ b/src/ssl/mod.rs @@ -24,6 +24,7 @@ fn init() { unsafe { INIT.doit(|| { ffi::SSL_library_init(); + ffi::SSL_load_error_strings(); // maybe add err_load_crypto_strings? let verify_idx = ffi::SSL_CTX_get_ex_new_index(0, ptr::null(), None, None, None); assert!(verify_idx >= 0);