//! Access Control support. use std::ptr::{self, null}; use core_foundation::base::{TCFType, CFOptionFlags, kCFAllocatorDefault}; use security_framework_sys::access_control::{SecAccessControlGetTypeID, SecAccessControlCreateWithFlags}; use security_framework_sys::base::{SecAccessControlRef, errSecParam}; use crate::base::{Error, Result}; declare_TCFType! { /// A type representing sec access control settings. SecAccessControl, SecAccessControlRef } impl_TCFType!( SecAccessControl, SecAccessControlRef, SecAccessControlGetTypeID ); unsafe impl Sync for SecAccessControl {} unsafe impl Send for SecAccessControl {} impl SecAccessControl { /// Create `AccessControl` object from flags pub fn create_with_flags(flags: CFOptionFlags) -> Result { unsafe { let access_control = SecAccessControlCreateWithFlags( kCFAllocatorDefault, null(), flags, ptr::null_mut(), ); if access_control.is_null() { Err(Error::from_code(errSecParam)) } else { Ok(Self::wrap_under_create_rule(access_control)) } } } }