fn open_session_inner()

in pkcs11/pkcs11/src/context.rs [530:558]


    fn open_session_inner(
        self: std::sync::Arc<Self>,
        slot_id: pkcs11_sys::CK_SLOT_ID,
        pin: Option<String>,
    ) -> Result<crate::Session, OpenSessionError> {
        unsafe {
            let mut handle = pkcs11_sys::CK_INVALID_SESSION_HANDLE;
            let result = (self.C_OpenSession)(
                slot_id,
                pkcs11_sys::CKF_SERIAL_SESSION | pkcs11_sys::CKF_RW_SESSION,
                std::ptr::null_mut(),
                None,
                &mut handle,
            );
            if result != pkcs11_sys::CKR_OK {
                return Err(OpenSessionError::OpenSessionFailed(
                    format!("C_OpenSession failed with {result}").into(),
                ));
            }
            if handle == pkcs11_sys::CK_INVALID_SESSION_HANDLE {
                return Err(OpenSessionError::OpenSessionFailed(
                    "C_OpenSession succeeded but session handle is still CK_INVALID_HANDLE".into(),
                ));
            }
            let session = crate::Session::new(self, handle, pin);

            Ok(session)
        }
    }