From eea07ef137992c80ab80e17f28d71abf04ef9079 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Wed, 23 Oct 2013 21:10:38 -0700 Subject: [PATCH] Slightly better error handling --- .gitignore | 5 +---- .travis.yml | 2 +- error.rs | 24 ++++++++++++++++++++++-- lib.rs | 2 ++ tests.rs | 15 ++++++++++++--- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 1d7e5da7..502167fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1 @@ -/.rust/ -/bin/ -/build/ -/lib/ +/lib diff --git a/.travis.yml b/.travis.yml index 2fb7b213..55c9e432 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ before_install: install: - sudo apt-get install rust-nightly before_script: - - openssl s_server -accept 15418 -www -cert test/cert.pem -key test/key.pem & + - openssl s_server -accept 15418 -www -cert test/cert.pem -key test/key.pem >/dev/null & script: - rustc --test lib.rs - ./lib diff --git a/error.rs b/error.rs index 90429996..5e5479f8 100644 --- a/error.rs +++ b/error.rs @@ -6,14 +6,34 @@ use super::ffi; pub enum SslError { StreamEof, SslSessionClosed, - UnknownError(c_ulong) + UnknownError { + library: u8, + function: u16, + reason: u16 + } +} + +fn get_lib(err: c_ulong) -> u8 { + ((err >> 24) & 0xff) as u8 +} + +fn get_func(err: c_ulong) -> u16 { + ((err >> 12) & 0xfff) as u16 +} + +fn get_reason(err: c_ulong) -> u16 { + (err & 0xfff) as u16 } impl SslError { pub fn get() -> Option { match unsafe { ffi::ERR_get_error() } { 0 => None, - err => Some(UnknownError(err)) + err => Some(UnknownError { + library: get_lib(err), + function: get_func(err), + reason: get_reason(err) + }) } } } diff --git a/lib.rs b/lib.rs index 4b5d4ba7..a15b7964 100644 --- a/lib.rs +++ b/lib.rs @@ -1,3 +1,5 @@ +#[feature(struct_variant)]; + use std::cast; use std::libc::{c_int, c_void}; use std::ptr; diff --git a/tests.rs b/tests.rs index 38d977c7..9ea5c00c 100644 --- a/tests.rs +++ b/tests.rs @@ -32,7 +32,10 @@ fn test_verify_trusted() { let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap(); let mut ctx = SslContext::new(Sslv23); ctx.set_verify(SslVerifyPeer, None); - assert!(ctx.set_CA_file("test/cert.pem").is_none()); + match ctx.set_CA_file("test/cert.pem") { + None => {} + Some(err) => fail!("Unexpected error {:?}", err) + } match SslStream::try_new(&ctx, stream) { Ok(_) => (), Err(err) => fail!("Expected success, got {:?}", err) @@ -72,7 +75,10 @@ fn test_verify_trusted_callback_override_ok() { let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap(); let mut ctx = SslContext::new(Sslv23); ctx.set_verify(SslVerifyPeer, Some(callback)); - assert!(ctx.set_CA_file("test/cert.pem").is_none()); + match ctx.set_CA_file("test/cert.pem") { + None => {} + Some(err) => fail!("Unexpected error {:?}", err) + } match SslStream::try_new(&ctx, stream) { Ok(_) => (), Err(err) => fail!("Expected success, got {:?}", err) @@ -87,7 +93,10 @@ fn test_verify_trusted_callback_override_bad() { let stream = TcpStream::connect(FromStr::from_str("127.0.0.1:15418").unwrap()).unwrap(); let mut ctx = SslContext::new(Sslv23); ctx.set_verify(SslVerifyPeer, Some(callback)); - assert!(ctx.set_CA_file("test/cert.pem").is_none()); + match ctx.set_CA_file("test/cert.pem") { + None => {} + Some(err) => fail!("Unexpected error {:?}", err) + } assert!(SslStream::try_new(&ctx, stream).is_err()); }