*/
#include "portable.h"
-#include "slapi_common.h"
#include <ldap_pvt_thread.h>
#include <slap.h>
#include <slapi.h>
* Output: none
*
* Return Values: this routine returns a pointer to an array of function
- * pointers
+ * pointers containing backend-specific plugin functions
+ * followed by global plugin functions
*
* Messages: None
*********************************************************************/
assert( ppFuncPtrs );
- pCurrentPB = ( be == NULL ) ? pGPlugins : (Slapi_PBlock *)(be->be_pb);
-
- if ( pCurrentPB == NULL ) {
- /*
- * LDAP_OTHER is returned if no plugins are installed
- */
- rc = LDAP_OTHER;
+ /*
+ * First, count the plugins associated with a specific
+ * backend.
+ */
+ if ( be != NULL ) {
+ pCurrentPB = (Slapi_PBlock *)be->be_pb;
+
+ while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
+ rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
+ if ( rc == LDAP_SUCCESS ) {
+ if ( FuncPtr != NULL ) {
+ numPB++;
+ }
+ rc = slapi_pblock_get( pCurrentPB,
+ SLAPI_IBM_PBLOCK, &pCurrentPB );
+ }
+ }
+ }
+
+ if ( rc != LDAP_SUCCESS ) {
goto done;
}
- while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
+ /*
+ * Then, count the global plugins.
+ */
+ pCurrentPB = pGPlugins;
+
+ while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
if ( rc == LDAP_SUCCESS ) {
if ( FuncPtr != NULL ) {
goto done;
}
+ /*
+ * Now, build the function pointer array of backend-specific
+ * plugins followed by global plugins.
+ */
*ppFuncPtrs = pTmpFuncPtr =
(SLAPI_FUNC *)ch_malloc( ( numPB + 1 ) * sizeof(SLAPI_FUNC) );
if ( ppFuncPtrs == NULL ) {
goto done;
}
- pCurrentPB = ( be == NULL ) ? pGPlugins : (Slapi_PBlock *)(be->be_pb);
+ if ( be != NULL ) {
+ pCurrentPB = (Slapi_PBlock *)be->be_pb;
+
+ while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
+ rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
+ if ( rc == LDAP_SUCCESS ) {
+ if ( FuncPtr != NULL ) {
+ *pTmpFuncPtr = FuncPtr;
+ pTmpFuncPtr++;
+ }
+ rc = slapi_pblock_get( pCurrentPB,
+ SLAPI_IBM_PBLOCK, &pCurrentPB );
+ }
+ }
+ }
+
+ pCurrentPB = pGPlugins;
+
while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) {
rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr );
if ( rc == LDAP_SUCCESS ) {
return rc;
}
-
+
/*********************************************************************
* Function Name: createExtendedOp
*
int rc = 0;
SLAPI_FUNC *pGetPlugin = NULL, *tmpPlugin = NULL;
- rc = getAllPluginFuncs(be, funcType, &tmpPlugin );
+ if ( pPB == NULL ) {
+ return 0;
+ }
+
+ rc = getAllPluginFuncs( be, funcType, &tmpPlugin );
if ( rc != LDAP_SUCCESS || tmpPlugin == NULL ) {
/* Nothing to do, front-end should ignore. */
return 0;
slapi_ch_free( (void **)&tmpPlugin );
- /*
- * If we failed, and this wasn't a postoperation plugin, we
- * should return the failure to the frontend.
- */
- if ( !SLAPI_PLUGIN_IS_POST_FN( funcType ) && rc != 0 ) {
- return rc;
- }
-
- /*
- * Try any global plugins (not associated with a specific
- * backend); same logic as above.
- */
- if ( be != NULL ) {
- rc = getAllPluginFuncs( NULL, funcType, &tmpPlugin );
- if ( rc != LDAP_SUCCESS || tmpPlugin == NULL )
- return 0;
- for ( pGetPlugin = tmpPlugin; *pGetPlugin != NULL; pGetPlugin++ ) {
- rc = (*pGetPlugin)(pPB);
- if ( !SLAPI_PLUGIN_IS_POST_FN( funcType ) && rc != 0 ) {
- break;
- }
- }
- }
-
- slapi_ch_free( (void **)&tmpPlugin );
-
return rc;
}