192f3ab15Sopenharmony_ciuse cfg_if::cfg_if;
292f3ab15Sopenharmony_ciuse libc::c_int;
392f3ab15Sopenharmony_ciuse std::marker::PhantomData;
492f3ab15Sopenharmony_ciuse std::ptr;
592f3ab15Sopenharmony_ciuse std::slice;
692f3ab15Sopenharmony_ci
792f3ab15Sopenharmony_ciuse crate::cvt_p;
892f3ab15Sopenharmony_ciuse crate::error::ErrorStack;
992f3ab15Sopenharmony_ci
1092f3ab15Sopenharmony_cipub struct MemBioSlice<'a>(*mut ffi::BIO, PhantomData<&'a [u8]>);
1192f3ab15Sopenharmony_ci
1292f3ab15Sopenharmony_ciimpl<'a> Drop for MemBioSlice<'a> {
1392f3ab15Sopenharmony_ci    fn drop(&mut self) {
1492f3ab15Sopenharmony_ci        unsafe {
1592f3ab15Sopenharmony_ci            ffi::BIO_free_all(self.0);
1692f3ab15Sopenharmony_ci        }
1792f3ab15Sopenharmony_ci    }
1892f3ab15Sopenharmony_ci}
1992f3ab15Sopenharmony_ci
2092f3ab15Sopenharmony_ciimpl<'a> MemBioSlice<'a> {
2192f3ab15Sopenharmony_ci    pub fn new(buf: &'a [u8]) -> Result<MemBioSlice<'a>, ErrorStack> {
2292f3ab15Sopenharmony_ci        ffi::init();
2392f3ab15Sopenharmony_ci
2492f3ab15Sopenharmony_ci        assert!(buf.len() <= c_int::max_value() as usize);
2592f3ab15Sopenharmony_ci        let bio = unsafe {
2692f3ab15Sopenharmony_ci            cvt_p(BIO_new_mem_buf(
2792f3ab15Sopenharmony_ci                buf.as_ptr() as *const _,
2892f3ab15Sopenharmony_ci                buf.len() as crate::SLenType,
2992f3ab15Sopenharmony_ci            ))?
3092f3ab15Sopenharmony_ci        };
3192f3ab15Sopenharmony_ci
3292f3ab15Sopenharmony_ci        Ok(MemBioSlice(bio, PhantomData))
3392f3ab15Sopenharmony_ci    }
3492f3ab15Sopenharmony_ci
3592f3ab15Sopenharmony_ci    pub fn as_ptr(&self) -> *mut ffi::BIO {
3692f3ab15Sopenharmony_ci        self.0
3792f3ab15Sopenharmony_ci    }
3892f3ab15Sopenharmony_ci}
3992f3ab15Sopenharmony_ci
4092f3ab15Sopenharmony_cipub struct MemBio(*mut ffi::BIO);
4192f3ab15Sopenharmony_ci
4292f3ab15Sopenharmony_ciimpl Drop for MemBio {
4392f3ab15Sopenharmony_ci    fn drop(&mut self) {
4492f3ab15Sopenharmony_ci        unsafe {
4592f3ab15Sopenharmony_ci            ffi::BIO_free_all(self.0);
4692f3ab15Sopenharmony_ci        }
4792f3ab15Sopenharmony_ci    }
4892f3ab15Sopenharmony_ci}
4992f3ab15Sopenharmony_ci
5092f3ab15Sopenharmony_ciimpl MemBio {
5192f3ab15Sopenharmony_ci    pub fn new() -> Result<MemBio, ErrorStack> {
5292f3ab15Sopenharmony_ci        ffi::init();
5392f3ab15Sopenharmony_ci
5492f3ab15Sopenharmony_ci        let bio = unsafe { cvt_p(ffi::BIO_new(ffi::BIO_s_mem()))? };
5592f3ab15Sopenharmony_ci        Ok(MemBio(bio))
5692f3ab15Sopenharmony_ci    }
5792f3ab15Sopenharmony_ci
5892f3ab15Sopenharmony_ci    pub fn as_ptr(&self) -> *mut ffi::BIO {
5992f3ab15Sopenharmony_ci        self.0
6092f3ab15Sopenharmony_ci    }
6192f3ab15Sopenharmony_ci
6292f3ab15Sopenharmony_ci    pub fn get_buf(&self) -> &[u8] {
6392f3ab15Sopenharmony_ci        unsafe {
6492f3ab15Sopenharmony_ci            let mut ptr = ptr::null_mut();
6592f3ab15Sopenharmony_ci            let len = ffi::BIO_get_mem_data(self.0, &mut ptr);
6692f3ab15Sopenharmony_ci            slice::from_raw_parts(ptr as *const _ as *const _, len as usize)
6792f3ab15Sopenharmony_ci        }
6892f3ab15Sopenharmony_ci    }
6992f3ab15Sopenharmony_ci
7092f3ab15Sopenharmony_ci    #[cfg(not(boringssl))]
7192f3ab15Sopenharmony_ci    pub unsafe fn from_ptr(bio: *mut ffi::BIO) -> MemBio {
7292f3ab15Sopenharmony_ci        MemBio(bio)
7392f3ab15Sopenharmony_ci    }
7492f3ab15Sopenharmony_ci}
7592f3ab15Sopenharmony_ci
7692f3ab15Sopenharmony_cicfg_if! {
7792f3ab15Sopenharmony_ci    if #[cfg(any(ossl102, boringssl))] {
7892f3ab15Sopenharmony_ci        use ffi::BIO_new_mem_buf;
7992f3ab15Sopenharmony_ci    } else {
8092f3ab15Sopenharmony_ci        #[allow(bad_style)]
8192f3ab15Sopenharmony_ci        unsafe fn BIO_new_mem_buf(buf: *const ::libc::c_void, len: ::libc::c_int) -> *mut ffi::BIO {
8292f3ab15Sopenharmony_ci            ffi::BIO_new_mem_buf(buf as *mut _, len)
8392f3ab15Sopenharmony_ci        }
8492f3ab15Sopenharmony_ci    }
8592f3ab15Sopenharmony_ci}
86