blob: dd387e2fa8a306621bda4360701fe0eff14dba3b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
use libc::c_ulong;
use std::io::IoError;
use ssl::ffi;
/// An SSL error
#[deriving(Show)]
pub enum SslError {
/// The underlying stream has reported an error
StreamError(IoError),
/// The SSL session has been closed by the other end
SslSessionClosed,
/// An error in the OpenSSL library
OpenSslErrors(Vec<OpensslError>)
}
/// An error from the OpenSSL library
#[deriving(Show)]
pub enum OpensslError {
/// An unknown error
UnknownError {
/// The library reporting the error
library: u8,
/// The function reporting the error
function: u16,
/// The reason for the error
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 {
/// Creates a new `OpenSslErrors` with the current contents of the error
/// stack.
pub fn get() -> SslError {
let mut errs = vec!();
loop {
match unsafe { ffi::ERR_get_error() } {
0 => break,
err => errs.push(UnknownError {
library: get_lib(err),
function: get_func(err),
reason: get_reason(err)
})
}
}
OpenSslErrors(errs)
}
}
|