aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2013-10-05 10:56:36 -0700
committerSteven Fackler <[email protected]>2013-10-05 10:56:36 -0700
commit58eb7ab5c4e29922e6cee4c21ca5420e3504a654 (patch)
treea278e977833589e4a934f749e2d57f92155c2bd5
parentBasic library initialization (diff)
downloadrust-openssl-58eb7ab5c4e29922e6cee4c21ca5420e3504a654.tar.xz
rust-openssl-58eb7ab5c4e29922e6cee4c21ca5420e3504a654.zip
Create contexts
-rw-r--r--src/ssl/ffi.rs14
-rw-r--r--src/ssl/lib.rs55
-rw-r--r--src/ssl/test.rs6
3 files changed, 65 insertions, 10 deletions
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);
}