From 58eb7ab5c4e29922e6cee4c21ca5420e3504a654 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Sat, 5 Oct 2013 10:56:36 -0700 Subject: [PATCH] Create contexts --- src/ssl/ffi.rs | 14 +++++++++++++ src/ssl/lib.rs | 55 ++++++++++++++++++++++++++++++++++++++++++------- src/ssl/test.rs | 6 ++++-- 3 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 src/ssl/ffi.rs diff --git a/src/ssl/ffi.rs b/src/ssl/ffi.rs new file mode 100644 index 00000000..788765fb --- /dev/null +++ b/src/ssl/ffi.rs @@ -0,0 +1,14 @@ +use std::libc::{c_int, c_void}; + +pub type SSL_CTX = c_void; +pub type SSL_METHOD = c_void; + +#[link_args = "-lssl"] +extern "C" { + fn SSL_library_init() -> c_int; + fn SSL_load_error_strings(); + + fn SSL_CTX_new(method: *SSL_METHOD) -> *SSL_CTX; + fn SSLv23_method() -> *SSL_METHOD; + fn SSL_CTX_free(ctx: *SSL_CTX); +} diff --git a/src/ssl/lib.rs b/src/ssl/lib.rs index d52a0cfa..a7c5588f 100644 --- a/src/ssl/lib.rs +++ b/src/ssl/lib.rs @@ -1,18 +1,57 @@ +use std::unstable::atomics::{AtomicBool, INIT_ATOMIC_BOOL, Acquire, Release}; +use std::task; -mod ffi { - use std::libc::{c_int}; +mod ffi; - #[link_args = "-lssl"] - extern "C" { - fn SSL_library_init() -> c_int; - fn SSL_load_error_strings(); - } -} +static mut STARTED_INIT: AtomicBool = INIT_ATOMIC_BOOL; +static mut FINISHED_INIT: AtomicBool = INIT_ATOMIC_BOOL; #[fixed_stack_segment] pub fn init() { unsafe { + if STARTED_INIT.swap(true, Acquire) { + while !FINISHED_INIT.load(Release) { + task::deschedule(); + } + return; + } + ffi::SSL_library_init(); ffi::SSL_load_error_strings(); + FINISHED_INIT.store(true, Release); + } +} + +pub enum SslMethod { + Sslv23 +} + +impl SslMethod { + #[fixed_stack_segment] + unsafe fn to_raw(&self) -> *ffi::SSL_METHOD { + match *self { + Sslv23 => ffi::SSLv23_method() + } + } +} + +pub struct SslCtx { + priv ctx: *ffi::SSL_CTX +} + +impl Drop for SslCtx { + #[fixed_stack_segment] + fn drop(&mut self) { + unsafe { ffi::SSL_CTX_free(self.ctx); } + } +} + +impl SslCtx { + #[fixed_stack_segment] + pub fn new(method: SslMethod) -> SslCtx { + init(); + SslCtx { + ctx: unsafe { ffi::SSL_CTX_new(method.to_raw()) } + } } } diff --git a/src/ssl/test.rs b/src/ssl/test.rs index 798f07f3..d54613ee 100644 --- a/src/ssl/test.rs +++ b/src/ssl/test.rs @@ -1,6 +1,8 @@ extern mod ssl; +use ssl::{Sslv23, SslCtx}; + #[test] -fn test_init_works() { - ssl::init(); +fn test_new_ctx() { + SslCtx::new(Sslv23); }