Commit 58eb7ab5 authored by Steven Fackler's avatar Steven Fackler
Browse files

Create contexts

parent 6afafafe
Loading
Loading
Loading
Loading

src/ssl/ffi.rs

0 → 100644
+14 −0
Original line number Diff line number Diff line
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);
}
+47 −8
Original line number Diff line number Diff line
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()) }
        }
    }
}
+4 −2
Original line number Diff line number Diff line
extern mod ssl;

use ssl::{Sslv23, SslCtx};

#[test]
fn test_init_works() {
    ssl::init();
fn test_new_ctx() {
    SslCtx::new(Sslv23);
}