*/
#include "portable.h"
-#include "slapi_common.h"
#include <ldap_pvt_thread.h>
#include <slap.h>
#include <slapi.h>
/* pointer to link list of extended objects */
static ExtendedOp *pGExtendedOps = NULL;
+/* global plugins not associated with a specific backend */
+static Slapi_PBlock *pGPlugins = NULL;
/*********************************************************************
* Function Name: newPlugin
}
rc = loadPlugin( pPlugin, path, initfunc, TRUE, NULL, &hdLoadHandle );
+ if ( rc != 0 ) {
+ rc = LDAP_OTHER;
+ goto done;
+ }
done:
if ( rc != LDAP_SUCCESS && pPlugin != NULL ) {
Slapi_PBlock *pSavePB;
int rc = LDAP_SUCCESS;
- pTmpPB = (Slapi_PBlock *)(be->be_pb);
-
+ pTmpPB = ( be == NULL ) ? pGPlugins : (Slapi_PBlock *)(be->be_pb);
+
if ( pTmpPB == NULL ) {
- be->be_pb = (void *)pPB;
+ if ( be != NULL )
+ be->be_pb = (void *)pPB;
+ else
+ pGPlugins = pPB;
} else {
while ( pTmpPB != NULL && rc == LDAP_SUCCESS ) {
pSavePB = pTmpPB;
* 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
*********************************************************************/
int numPB = 0;
int rc = LDAP_SUCCESS;
- assert( be );
assert( ppFuncPtrs );
- pCurrentPB = (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 = (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
*
return rc;
}
-
+/*
+ * Special support for computed attribute plugins
+ */
int
doPluginFNs(
Backend *be,
Slapi_PBlock *pPB )
{
- int rc = LDAP_SUCCESS;
+ 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 ) {
- return rc;
+ /* Nothing to do, front-end should ignore. */
+ return 0;
}
for ( pGetPlugin = tmpPlugin ; *pGetPlugin != NULL; pGetPlugin++ ) {
}
}
- ch_free( tmpPlugin );
+ slapi_ch_free( (void **)&tmpPlugin );
return rc;
}
iType = SLAPI_PLUGIN_POSTOPERATION;
} else if ( strcasecmp( argv[1], "extendedop" ) == 0 ) {
iType = SLAPI_PLUGIN_EXTENDEDOP;
+ } else if ( strcasecmp( argv[1], "object" ) == 0 ) {
+ iType = SLAPI_PLUGIN_OBJECT;
} else {
fprintf( stderr, "%s: line %d: invalid plugin type \"%s\".\n",
fname, lineno, argv[1] );
if ( iType == SLAPI_PLUGIN_PREOPERATION ||
iType == SLAPI_PLUGIN_EXTENDEDOP ||
- iType == SLAPI_PLUGIN_POSTOPERATION ) {
+ iType == SLAPI_PLUGIN_POSTOPERATION ||
+ iType == SLAPI_PLUGIN_OBJECT ) {
int rc;
Slapi_PBlock *pPlugin;