1 //! Interface for processing OpenSSL configuration files. 2 3 foreign_type_and_impl_send_sync! { 4 type CType = ffi::CONF; 5 fn drop = ffi::NCONF_free; 6 7 pub struct Conf; 8 pub struct ConfRef; 9 } 10 11 #[cfg(not(boringssl))] 12 mod methods { 13 use super::Conf; 14 use crate::cvt_p; 15 use crate::error::ErrorStack; 16 use openssl_macros::corresponds; 17 18 pub struct ConfMethod(*mut ffi::CONF_METHOD); 19 20 impl ConfMethod { 21 /// Retrieve handle to the default OpenSSL configuration file processing function. 22 #[corresponds(NCONF_default)] 23 #[allow(clippy::should_implement_trait)] default() -> ConfMethod24 pub fn default() -> ConfMethod { 25 unsafe { 26 ffi::init(); 27 // `NCONF` stands for "New Conf", as described in crypto/conf/conf_lib.c. This is 28 // a newer API than the "CONF classic" functions. 29 ConfMethod(ffi::NCONF_default()) 30 } 31 } 32 33 /// Construct from raw pointer. 34 /// 35 /// # Safety 36 /// 37 /// The caller must ensure that the pointer is valid. from_ptr(ptr: *mut ffi::CONF_METHOD) -> ConfMethod38 pub unsafe fn from_ptr(ptr: *mut ffi::CONF_METHOD) -> ConfMethod { 39 ConfMethod(ptr) 40 } 41 42 /// Convert to raw pointer. as_ptr(&self) -> *mut ffi::CONF_METHOD43 pub fn as_ptr(&self) -> *mut ffi::CONF_METHOD { 44 self.0 45 } 46 } 47 48 impl Conf { 49 /// Create a configuration parser. 50 /// 51 /// # Examples 52 /// 53 /// ``` 54 /// use openssl::conf::{Conf, ConfMethod}; 55 /// 56 /// let conf = Conf::new(ConfMethod::default()); 57 /// ``` 58 #[corresponds(NCONF_new)] new(method: ConfMethod) -> Result<Conf, ErrorStack>59 pub fn new(method: ConfMethod) -> Result<Conf, ErrorStack> { 60 unsafe { cvt_p(ffi::NCONF_new(method.as_ptr())).map(Conf) } 61 } 62 } 63 } 64 #[cfg(not(boringssl))] 65 pub use methods::*; 66