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); } src/ssl/lib.rs +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()) } } } } src/ssl/test.rs +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); } 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); }
src/ssl/lib.rs +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()) } } } }
src/ssl/test.rs +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); }