X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapi%2Fplugin.c;h=5cabd8a7311d3ac60c97d09dd06e9dfb316c5ba1;hb=a253fbdab4668cf15d512866f53ff2f27fff2caa;hp=b4e99b988446e07952270cf630d1a04d76bff67c;hpb=281627d81d2b1862e7d86d8d4f8d8545bd0ff7e4;p=openldap diff --git a/servers/slapd/slapi/plugin.c b/servers/slapd/slapi/plugin.c index b4e99b9884..5cabd8a731 100644 --- a/servers/slapd/slapi/plugin.c +++ b/servers/slapd/slapi/plugin.c @@ -1,35 +1,44 @@ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2002-2005 The OpenLDAP Foundation. + * Portions Copyright 1997,2002-2003 IBM Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* - * (C) Copyright IBM Corp. 1997,2002 - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is - * given to IBM Corporation. This software is provided ``as is'' - * without express or implied warranty. +/* ACKNOWLEDGEMENTS: + * This work was initially developed by IBM Corporation for use in + * IBM products and subsequently ported to OpenLDAP Software by + * Steve Omrani. Additional significant contributors include: + * Luke Howard */ #include "portable.h" #include #include #include +#include /* * Note: if ltdl.h is not available, slapi should not be compiled */ #include -static int loadPlugin( Slapi_PBlock *, const char *, const char *, int, +static int slapi_int_load_plugin( Slapi_PBlock *, const char *, const char *, int, SLAPI_FUNC *, lt_dlhandle * ); /* 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 + * Function Name: plugin_pblock_new * * Description: This routine creates a new Slapi_PBlock structure, * loads in the plugin module and executes the init @@ -51,17 +60,19 @@ static Slapi_PBlock *pGPlugins = NULL; * Messages: None *********************************************************************/ -Slapi_PBlock * -newPlugin( +static Slapi_PBlock * +plugin_pblock_new( int type, - const char *path, - const char *initfunc, int argc, char *argv[] ) { Slapi_PBlock *pPlugin = NULL; + Slapi_PluginDesc *pPluginDesc = NULL; lt_dlhandle hdLoadHandle; int rc; + char **av2 = NULL, **ppPluginArgv; + char *path = argv[2]; + char *initfunc = argv[3]; pPlugin = slapi_pblock_new(); if ( pPlugin == NULL ) { @@ -70,37 +81,65 @@ newPlugin( } rc = slapi_pblock_set( pPlugin, SLAPI_PLUGIN_TYPE, (void *)type ); - if ( rc != LDAP_SUCCESS ) { + if ( rc != 0 ) { goto done; } rc = slapi_pblock_set( pPlugin, SLAPI_PLUGIN_ARGC, (void *)argc ); - if ( rc != LDAP_SUCCESS ) { + if ( rc != 0 ) { + goto done; + } + + av2 = ldap_charray_dup( argv ); + if ( av2 == NULL ) { + rc = LDAP_NO_MEMORY; goto done; } - rc = slapi_pblock_set( pPlugin, SLAPI_PLUGIN_ARGV, (void *)argv ); - if ( rc != LDAP_SUCCESS ) { + if ( argc > 0 ) { + ppPluginArgv = &av2[4]; + } else { + ppPluginArgv = NULL; + } + rc = slapi_pblock_set( pPlugin, SLAPI_PLUGIN_ARGV, (void *)ppPluginArgv ); + if ( rc != 0 ) { goto done; } - rc = loadPlugin( pPlugin, path, initfunc, TRUE, NULL, &hdLoadHandle ); + rc = slapi_pblock_set( pPlugin, SLAPI_X_CONFIG_ARGV, (void *)av2 ); + if ( rc != 0 ) { + goto done; + } + + rc = slapi_int_load_plugin( pPlugin, path, initfunc, 1, NULL, &hdLoadHandle ); if ( rc != 0 ) { - rc = LDAP_OTHER; goto done; } + if ( slapi_pblock_get( pPlugin, SLAPI_PLUGIN_DESCRIPTION, (void **)&pPluginDesc ) == 0 && + pPluginDesc != NULL ) { + slapi_log_error(SLAPI_LOG_TRACE, "plugin_pblock_new", + "Registered plugin %s %s [%s] (%s)\n", + pPluginDesc->spd_id, + pPluginDesc->spd_version, + pPluginDesc->spd_vendor, + pPluginDesc->spd_description); + } + done: - if ( rc != LDAP_SUCCESS && pPlugin != NULL ) { + if ( rc != 0 && pPlugin != NULL ) { slapi_pblock_destroy( pPlugin ); pPlugin = NULL; + if ( av2 != NULL ) { + ldap_charray_free( av2 ); + } } return pPlugin; } /********************************************************************* - * Function Name: insertPlugin + * Function Name: slapi_int_register_plugin * * Description: insert the slapi_pblock structure to the end of the plugin * list @@ -116,7 +155,7 @@ done: * Messages: None *********************************************************************/ int -insertPlugin( +slapi_int_register_plugin( Backend *be, Slapi_PBlock *pPB ) { @@ -124,37 +163,27 @@ insertPlugin( Slapi_PBlock *pSavePB; int rc = LDAP_SUCCESS; - pTmpPB = ( be == NULL ) ? pGPlugins : (Slapi_PBlock *)(be->be_pb); + assert( be != NULL ); + pTmpPB = (Slapi_PBlock *)be->be_pb; if ( pTmpPB == NULL ) { - if ( be != NULL ) - be->be_pb = (void *)pPB; - else - pGPlugins = pPB; + be->be_pb = (void *)pPB; } else { while ( pTmpPB != NULL && rc == LDAP_SUCCESS ) { pSavePB = pTmpPB; - rc = slapi_pblock_get( pTmpPB, SLAPI_IBM_PBLOCK, - &pTmpPB ); - if ( rc != LDAP_SUCCESS ) { - rc = LDAP_OTHER; - } + rc = slapi_pblock_get( pTmpPB, SLAPI_IBM_PBLOCK, &pTmpPB ); } if ( rc == LDAP_SUCCESS ) { - rc = slapi_pblock_set( pSavePB, SLAPI_IBM_PBLOCK, - (void *)pPB ); - if ( rc != LDAP_SUCCESS ) { - rc = LDAP_OTHER; - } + rc = slapi_pblock_set( pSavePB, SLAPI_IBM_PBLOCK, (void *)pPB ); } } - return rc; + return ( rc != LDAP_SUCCESS ) ? LDAP_OTHER : LDAP_SUCCESS; } /********************************************************************* - * Function Name: getAllPluginFuncs + * Function Name: slapi_int_get_plugins * * Description: get the desired type of function pointers defined * in all the plugins @@ -170,7 +199,7 @@ insertPlugin( * Messages: None *********************************************************************/ int -getAllPluginFuncs( +slapi_int_get_plugins( Backend *be, int functype, SLAPI_FUNC **ppFuncPtrs ) @@ -182,51 +211,25 @@ getAllPluginFuncs( int numPB = 0; int rc = LDAP_SUCCESS; - assert( ppFuncPtrs ); - - /* - * 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 ); - } - } - } + assert( ppFuncPtrs != NULL ); - if ( rc != LDAP_SUCCESS ) { + if ( be == NULL ) { goto done; } - /* - * Then, count the global plugins. - */ - pCurrentPB = pGPlugins; + pCurrentPB = (Slapi_PBlock *)be->be_pb; - while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) { + 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 ); + SLAPI_IBM_PBLOCK, &pCurrentPB ); } } - if ( rc != LDAP_SUCCESS ) { - goto done; - } - if ( numPB == 0 ) { *ppFuncPtrs = NULL; rc = LDAP_SUCCESS; @@ -244,23 +247,7 @@ getAllPluginFuncs( goto done; } - 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; + pCurrentPB = (Slapi_PBlock *)be->be_pb; while ( pCurrentPB != NULL && rc == LDAP_SUCCESS ) { rc = slapi_pblock_get( pCurrentPB, functype, &FuncPtr ); @@ -273,7 +260,9 @@ getAllPluginFuncs( SLAPI_IBM_PBLOCK, &pCurrentPB ); } } - *pTmpFuncPtr = NULL ; + + *pTmpFuncPtr = NULL; + done: if ( rc != LDAP_SUCCESS && *ppFuncPtrs != NULL ) { @@ -311,7 +300,7 @@ createExtendedOp() /********************************************************************* - * Function Name: removeExtendedOp + * Function Name: slapi_int_unregister_extop * * Description: This routine removes the ExtendedOp structures * asscoiated with a particular extended operation @@ -329,7 +318,7 @@ createExtendedOp() * Messages: None *********************************************************************/ void -removeExtendedOp( +slapi_int_unregister_extop( Backend *pBE, ExtendedOp **opList, Slapi_PBlock *pPB ) @@ -378,7 +367,7 @@ removeExtendedOp( /********************************************************************* - * Function Name: newExtendedOp + * Function Name: slapi_int_register_extop * * Description: This routine creates a new ExtendedOp structure, loads * in the extended op module and put the extended op function address @@ -397,7 +386,7 @@ removeExtendedOp( * Messages: None *********************************************************************/ int -newExtendedOp( +slapi_int_register_extop( Backend *pBE, ExtendedOp **opList, Slapi_PBlock *pPB ) @@ -429,7 +418,7 @@ newExtendedOp( } rc = slapi_pblock_get( pPB,SLAPI_PLUGIN_EXT_OP_OIDLIST, &pTmpOIDs ); - if ( rc != LDAP_SUCCESS ) { + if ( rc != 0 ) { rc = LDAP_OTHER; goto error_return; } @@ -465,7 +454,7 @@ error_return: } /********************************************************************* - * Function Name: getPluginFunc + * Function Name: slapi_int_get_extop_plugin * * Description: This routine gets the function address for a given function * name. @@ -481,7 +470,7 @@ error_return: * Messages: None *********************************************************************/ int -getPluginFunc( +slapi_int_get_extop_plugin( struct berval *reqoid, SLAPI_FUNC *pFuncAddr ) { @@ -512,12 +501,12 @@ getPluginFunc( } /*************************************************************************** - * This function is similar to getPluginFunc above. except it returns one OID + * This function is similar to slapi_int_get_extop_plugin above. except it returns one OID * per call. It is called from root_dse_info (root_dse.c). * The function is a modified version of get_supported_extop (file extended.c). ***************************************************************************/ struct berval * -ns_get_supported_extop( int index ) +slapi_int_get_supported_extop( int index ) { ExtendedOp *ext; @@ -534,7 +523,7 @@ ns_get_supported_extop( int index ) } /********************************************************************* - * Function Name: loadPlugin + * Function Name: slapi_int_load_plugin * * Description: This routine loads the specified DLL, gets and executes the init function * if requested. @@ -558,7 +547,7 @@ ns_get_supported_extop( int index ) *********************************************************************/ static int -loadPlugin( +slapi_int_load_plugin( Slapi_PBlock *pPlugin, const char *path, const char *initfunc, @@ -569,7 +558,7 @@ loadPlugin( int rc = LDAP_SUCCESS; SLAPI_FUNC fpInitFunc = NULL; - assert( pLdHandle ); + assert( pLdHandle != NULL ); if ( lt_dlinit() ) { return LDAP_LOCAL_ERROR; @@ -587,7 +576,7 @@ loadPlugin( return LDAP_LOCAL_ERROR; } - if ( doInit == TRUE ) { + if ( doInit ) { rc = ( *fpInitFunc )( pPlugin ); if ( rc != LDAP_SUCCESS ) { lt_dlclose( *pLdHandle ); @@ -604,7 +593,7 @@ loadPlugin( * Special support for computed attribute plugins */ int -doPluginFNs( +slapi_int_call_plugins( Backend *be, int funcType, Slapi_PBlock *pPB ) @@ -617,7 +606,7 @@ doPluginFNs( return 1; } - rc = getAllPluginFuncs( be, funcType, &tmpPlugin ); + rc = slapi_int_get_plugins( be, funcType, &tmpPlugin ); if ( rc != LDAP_SUCCESS || tmpPlugin == NULL ) { /* Nothing to do, front-end should ignore. */ return 1; @@ -652,7 +641,7 @@ doPluginFNs( } int -netscape_plugin( +slapi_int_read_config( Backend *be, const char *fname, int lineno, @@ -661,7 +650,6 @@ netscape_plugin( { int iType = -1; int numPluginArgc = 0; - char **ppPluginArgv = NULL; if ( argc < 4 ) { fprintf( stderr, @@ -671,6 +659,14 @@ netscape_plugin( fname, lineno ); return 1; } + + /* automatically instantiate overlay if necessary */ + if ( !overlay_is_inst( be, SLAPI_OVERLAY_NAME ) ) { + if ( overlay_config( be, SLAPI_OVERLAY_NAME ) != 0 ) { + fprintf( stderr, "Failed to instantiate SLAPI overlay\n"); + return -1; + } + } if ( strcasecmp( argv[1], "preoperation" ) == 0 ) { iType = SLAPI_PLUGIN_PREOPERATION; @@ -687,11 +683,6 @@ netscape_plugin( } numPluginArgc = argc - 4; - if ( numPluginArgc > 0 ) { - ppPluginArgv = &argv[4]; - } else { - ppPluginArgv = NULL; - } if ( iType == SLAPI_PLUGIN_PREOPERATION || iType == SLAPI_PLUGIN_EXTENDEDOP || @@ -700,24 +691,23 @@ netscape_plugin( int rc; Slapi_PBlock *pPlugin; - pPlugin = newPlugin( iType, argv[2], argv[3], - numPluginArgc, ppPluginArgv ); + pPlugin = plugin_pblock_new( iType, numPluginArgc, argv ); if (pPlugin == NULL) { return 1; } if (iType == SLAPI_PLUGIN_EXTENDEDOP) { - rc = newExtendedOp(be, &pGExtendedOps, pPlugin); + rc = slapi_int_register_extop(be, &pGExtendedOps, pPlugin); if ( rc != LDAP_SUCCESS ) { slapi_pblock_destroy( pPlugin ); return 1; } } - rc = insertPlugin( be, pPlugin ); + rc = slapi_int_register_plugin( be, pPlugin ); if ( rc != LDAP_SUCCESS ) { if ( iType == SLAPI_PLUGIN_EXTENDEDOP ) { - removeExtendedOp( be, &pGExtendedOps, pPlugin ); + slapi_int_unregister_extop( be, &pGExtendedOps, pPlugin ); } slapi_pblock_destroy( pPlugin ); return 1; @@ -727,8 +717,46 @@ netscape_plugin( return 0; } +void +slapi_int_plugin_unparse( + Backend *be, + BerVarray *out +) +{ + Slapi_PBlock *pp; + int i, j; + char **argv, ibuf[32], *ptr; + struct berval idx, bv; + + *out = NULL; + idx.bv_val = ibuf; + i = 0; + + for ( pp = be->be_pb; + pp != NULL; + slapi_pblock_get( pp, SLAPI_IBM_PBLOCK, &pp ) ) + { + slapi_pblock_get( pp, SLAPI_X_CONFIG_ARGV, &argv ); + if ( argv == NULL ) /* could be dynamic plugin */ + continue; + idx.bv_len = sprintf( idx.bv_val, "{%d}", i ); + bv.bv_len = idx.bv_len; + for (j=1; argv[j]; j++) { + bv.bv_len += strlen(argv[j]); + if ( j ) bv.bv_len++; + } + bv.bv_val = ch_malloc( bv.bv_len + 1 ); + ptr = lutil_strcopy( bv.bv_val, ibuf ); + for (j=1; argv[j]; j++) { + if ( j ) *ptr++ = ' '; + ptr = lutil_strcopy( ptr, argv[j] ); + } + ber_bvarray_add( out, &bv ); + } +} + int -slapi_init(void) +slapi_int_initialize(void) { if ( ldap_pvt_thread_mutex_init( &slapi_hn_mutex ) ) { return -1; @@ -747,10 +775,9 @@ slapi_init(void) return -1; } - if ( slapi_x_init_object_extensions() != 0 ) { + if ( slapi_int_init_object_extensions() != 0 ) { return -1; } - return 0; + return slapi_int_overlay_init(); } -