aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/ssl/bio.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openssl/src/ssl/bio.rs')
-rw-r--r--openssl/src/ssl/bio.rs204
1 files changed, 100 insertions, 104 deletions
diff --git a/openssl/src/ssl/bio.rs b/openssl/src/ssl/bio.rs
index 4b792a75..1a149b6d 100644
--- a/openssl/src/ssl/bio.rs
+++ b/openssl/src/ssl/bio.rs
@@ -1,11 +1,13 @@
+use ffi::{
+ self, BIO_clear_retry_flags, BIO_new, BIO_set_retry_read, BIO_set_retry_write, BIO,
+ BIO_CTRL_FLUSH,
+};
use libc::{c_char, c_int, c_long, c_void, strlen};
-use ffi::{BIO, BIO_CTRL_FLUSH, BIO_new, BIO_clear_retry_flags, BIO_set_retry_read,
- BIO_set_retry_write};
use std::any::Any;
use std::io;
use std::io::prelude::*;
use std::mem;
-use std::panic::{AssertUnwindSafe, catch_unwind};
+use std::panic::{catch_unwind, AssertUnwindSafe};
use std::ptr;
use std::slice;
@@ -19,11 +21,11 @@ pub struct StreamState<S> {
}
/// Safe wrapper for BIO_METHOD
-pub struct BioMethod(compat::BIO_METHOD);
+pub struct BioMethod(BIO_METHOD);
impl BioMethod {
fn new<S: Read + Write>() -> BioMethod {
- BioMethod(compat::BIO_METHOD::new::<S>())
+ BioMethod(BIO_METHOD::new::<S>())
}
}
@@ -41,8 +43,8 @@ pub fn new<S: Read + Write>(stream: S) -> Result<(*mut BIO, BioMethod), ErrorSta
unsafe {
let bio = cvt_p(BIO_new(method.0.get()))?;
- compat::BIO_set_data(bio, Box::into_raw(state) as *mut _);
- compat::BIO_set_init(bio, 1);
+ BIO_set_data(bio, Box::into_raw(state) as *mut _);
+ BIO_set_init(bio, 1);
return Ok((bio, method));
}
@@ -59,7 +61,7 @@ pub unsafe fn take_panic<S>(bio: *mut BIO) -> Option<Box<Any + Send>> {
}
pub unsafe fn get_ref<'a, S: 'a>(bio: *mut BIO) -> &'a S {
- let state: &'a StreamState<S> = mem::transmute(compat::BIO_get_data(bio));
+ let state: &'a StreamState<S> = mem::transmute(BIO_get_data(bio));
&state.stream
}
@@ -68,7 +70,7 @@ pub unsafe fn get_mut<'a, S: 'a>(bio: *mut BIO) -> &'a mut S {
}
unsafe fn state<'a, S: 'a>(bio: *mut BIO) -> &'a mut StreamState<S> {
- &mut *(compat::BIO_get_data(bio) as *mut _)
+ &mut *(BIO_get_data(bio) as *mut _)
}
unsafe extern "C" fn bwrite<S: Write>(bio: *mut BIO, buf: *const c_char, len: c_int) -> c_int {
@@ -117,8 +119,7 @@ unsafe extern "C" fn bread<S: Read>(bio: *mut BIO, buf: *mut c_char, len: c_int)
fn retriable_error(err: &io::Error) -> bool {
match err.kind() {
- io::ErrorKind::WouldBlock |
- io::ErrorKind::NotConnected => true,
+ io::ErrorKind::WouldBlock | io::ErrorKind::NotConnected => true,
_ => false,
}
}
@@ -153,10 +154,10 @@ unsafe extern "C" fn ctrl<S: Write>(
}
unsafe extern "C" fn create(bio: *mut BIO) -> c_int {
- compat::BIO_set_init(bio, 0);
- compat::BIO_set_num(bio, 0);
- compat::BIO_set_data(bio, ptr::null_mut());
- compat::BIO_set_flags(bio, 0);
+ BIO_set_init(bio, 0);
+ BIO_set_num(bio, 0);
+ BIO_set_data(bio, ptr::null_mut());
+ BIO_set_flags(bio, 0);
1
}
@@ -165,115 +166,110 @@ unsafe extern "C" fn destroy<S>(bio: *mut BIO) -> c_int {
return 0;
}
- let data = compat::BIO_get_data(bio);
+ let data = BIO_get_data(bio);
assert!(!data.is_null());
Box::<StreamState<S>>::from_raw(data as *mut _);
- compat::BIO_set_data(bio, ptr::null_mut());
- compat::BIO_set_init(bio, 0);
+ BIO_set_data(bio, ptr::null_mut());
+ BIO_set_init(bio, 0);
1
}
-#[cfg(ossl110)]
-#[allow(bad_style)]
-mod compat {
- use std::io::{Read, Write};
-
- use libc::c_int;
- use ffi;
- pub use ffi::{BIO_set_init, BIO_set_flags, BIO_set_data, BIO_get_data};
-
- pub unsafe fn BIO_set_num(_bio: *mut ffi::BIO, _num: c_int) {}
-
- pub struct BIO_METHOD(*mut ffi::BIO_METHOD);
-
- impl BIO_METHOD {
- pub fn new<S: Read + Write>() -> BIO_METHOD {
- unsafe {
- let ptr = ffi::BIO_meth_new(ffi::BIO_TYPE_NONE, b"rust\0".as_ptr() as *const _);
- assert!(!ptr.is_null());
- let ret = BIO_METHOD(ptr);
- assert!(ffi::BIO_meth_set_write(ptr, super::bwrite::<S>) != 0);
- assert!(ffi::BIO_meth_set_read(ptr, super::bread::<S>) != 0);
- assert!(ffi::BIO_meth_set_puts(ptr, super::bputs::<S>) != 0);
- assert!(ffi::BIO_meth_set_ctrl(ptr, super::ctrl::<S>) != 0);
- assert!(ffi::BIO_meth_set_create(ptr, super::create) != 0);
- assert!(ffi::BIO_meth_set_destroy(ptr, super::destroy::<S>) != 0);
- return ret;
+cfg_if! {
+ if #[cfg(ossl110)] {
+ use ffi::{BIO_get_data, BIO_set_data, BIO_set_flags, BIO_set_init};
+
+ #[allow(bad_style)]
+ unsafe fn BIO_set_num(_bio: *mut ffi::BIO, _num: c_int) {}
+
+ #[allow(bad_style)]
+ struct BIO_METHOD(*mut ffi::BIO_METHOD);
+
+ impl BIO_METHOD {
+ fn new<S: Read + Write>() -> BIO_METHOD {
+ unsafe {
+ let ptr = ffi::BIO_meth_new(ffi::BIO_TYPE_NONE, b"rust\0".as_ptr() as *const _);
+ assert!(!ptr.is_null());
+ let ret = BIO_METHOD(ptr);
+ assert!(ffi::BIO_meth_set_write(ptr, bwrite::<S>) != 0);
+ assert!(ffi::BIO_meth_set_read(ptr, bread::<S>) != 0);
+ assert!(ffi::BIO_meth_set_puts(ptr, bputs::<S>) != 0);
+ assert!(ffi::BIO_meth_set_ctrl(ptr, ctrl::<S>) != 0);
+ assert!(ffi::BIO_meth_set_create(ptr, create) != 0);
+ assert!(ffi::BIO_meth_set_destroy(ptr, destroy::<S>) != 0);
+ return ret;
+ }
}
- }
-
- pub fn get(&self) -> *mut ffi::BIO_METHOD {
- self.0
- }
- }
- impl Drop for BIO_METHOD {
- fn drop(&mut self) {
- unsafe {
- ffi::BIO_meth_free(self.0);
+ fn get(&self) -> *mut ffi::BIO_METHOD {
+ self.0
}
}
- }
-}
-#[cfg(ossl10x)]
-#[allow(bad_style)]
-mod compat {
- use std::io::{Read, Write};
-
- use ffi;
- use libc::{c_int, c_void};
-
- pub struct BIO_METHOD(*mut ffi::BIO_METHOD);
-
- impl BIO_METHOD {
- pub fn new<S: Read + Write>() -> BIO_METHOD {
- let ptr = Box::new(ffi::BIO_METHOD {
- type_: ffi::BIO_TYPE_NONE,
- name: b"rust\0".as_ptr() as *const _,
- bwrite: Some(super::bwrite::<S>),
- bread: Some(super::bread::<S>),
- bputs: Some(super::bputs::<S>),
- bgets: None,
- ctrl: Some(super::ctrl::<S>),
- create: Some(super::create),
- destroy: Some(super::destroy::<S>),
- callback_ctrl: None,
- });
-
- BIO_METHOD(Box::into_raw(ptr))
+ impl Drop for BIO_METHOD {
+ fn drop(&mut self) {
+ unsafe {
+ ffi::BIO_meth_free(self.0);
+ }
+ }
}
+ } else {
+ #[allow(bad_style)]
+ struct BIO_METHOD(*mut ffi::BIO_METHOD);
+
+ impl BIO_METHOD {
+ fn new<S: Read + Write>() -> BIO_METHOD {
+ let ptr = Box::new(ffi::BIO_METHOD {
+ type_: ffi::BIO_TYPE_NONE,
+ name: b"rust\0".as_ptr() as *const _,
+ bwrite: Some(bwrite::<S>),
+ bread: Some(bread::<S>),
+ bputs: Some(bputs::<S>),
+ bgets: None,
+ ctrl: Some(ctrl::<S>),
+ create: Some(create),
+ destroy: Some(destroy::<S>),
+ callback_ctrl: None,
+ });
+
+ BIO_METHOD(Box::into_raw(ptr))
+ }
- pub fn get(&self) -> *mut ffi::BIO_METHOD {
- self.0
+ fn get(&self) -> *mut ffi::BIO_METHOD {
+ self.0
+ }
}
- }
- impl Drop for BIO_METHOD {
- fn drop(&mut self) {
- unsafe {
- Box::<ffi::BIO_METHOD>::from_raw(self.0);
+ impl Drop for BIO_METHOD {
+ fn drop(&mut self) {
+ unsafe {
+ Box::<ffi::BIO_METHOD>::from_raw(self.0);
+ }
}
}
- }
- pub unsafe fn BIO_set_init(bio: *mut ffi::BIO, init: c_int) {
- (*bio).init = init;
- }
+ #[allow(bad_style)]
+ unsafe fn BIO_set_init(bio: *mut ffi::BIO, init: c_int) {
+ (*bio).init = init;
+ }
- pub unsafe fn BIO_set_flags(bio: *mut ffi::BIO, flags: c_int) {
- (*bio).flags = flags;
- }
+ #[allow(bad_style)]
+ unsafe fn BIO_set_flags(bio: *mut ffi::BIO, flags: c_int) {
+ (*bio).flags = flags;
+ }
- pub unsafe fn BIO_get_data(bio: *mut ffi::BIO) -> *mut c_void {
- (*bio).ptr
- }
+ #[allow(bad_style)]
+ unsafe fn BIO_get_data(bio: *mut ffi::BIO) -> *mut c_void {
+ (*bio).ptr
+ }
- pub unsafe fn BIO_set_data(bio: *mut ffi::BIO, data: *mut c_void) {
- (*bio).ptr = data;
- }
+ #[allow(bad_style)]
+ unsafe fn BIO_set_data(bio: *mut ffi::BIO, data: *mut c_void) {
+ (*bio).ptr = data;
+ }
- pub unsafe fn BIO_set_num(bio: *mut ffi::BIO, num: c_int) {
- (*bio).num = num;
+ #[allow(bad_style)]
+ unsafe fn BIO_set_num(bio: *mut ffi::BIO, num: c_int) {
+ (*bio).num = num;
+ }
}
}