aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2013-10-23 21:10:38 -0700
committerSteven Fackler <[email protected]>2013-10-23 21:12:29 -0700
commiteea07ef137992c80ab80e17f28d71abf04ef9079 (patch)
tree3427c8b8524e4d759532c2834dcbe04a116c5134
parentRemove Sslv2 option (diff)
downloadrust-openssl-eea07ef137992c80ab80e17f28d71abf04ef9079.tar.xz
rust-openssl-eea07ef137992c80ab80e17f28d71abf04ef9079.zip
Slightly better error handling
-rw-r--r--.gitignore5
-rw-r--r--.travis.yml2
-rw-r--r--error.rs24
-rw-r--r--lib.rs2
-rw-r--r--tests.rs15
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<SslError> {
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());
}