Create contexts

This commit is contained in:
Steven Fackler 2013-10-05 10:56:36 -07:00
parent 6afafafe60
commit 58eb7ab5c4
3 changed files with 65 additions and 10 deletions

14
src/ssl/ffi.rs Normal file
View File

@ -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);
}

View File

@ -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()) }
}
}
}

View File

@ -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);
}