📄 plugin.c
字号:
*********************************************************************/int slapi_int_register_extop( Backend *pBE, ExtendedOp **opList, Slapi_PBlock *pPB ){ ExtendedOp *pTmpExtOp = NULL; SLAPI_FUNC tmpFunc; char **pTmpOIDs; int rc = LDAP_OTHER; int i; if ( (*opList) == NULL ) { *opList = createExtendedOp(); if ( (*opList) == NULL ) { rc = LDAP_NO_MEMORY; goto error_return; } pTmpExtOp = *opList; } else { /* Find the end of the list */ for ( pTmpExtOp = *opList; pTmpExtOp->ext_next != NULL; pTmpExtOp = pTmpExtOp->ext_next ) ; /* EMPTY */ pTmpExtOp->ext_next = createExtendedOp(); if ( pTmpExtOp->ext_next == NULL ) { rc = LDAP_NO_MEMORY; goto error_return; } pTmpExtOp = pTmpExtOp->ext_next; } rc = slapi_pblock_get( pPB,SLAPI_PLUGIN_EXT_OP_OIDLIST, &pTmpOIDs ); if ( rc != 0 ) { rc = LDAP_OTHER; goto error_return; } rc = slapi_pblock_get(pPB,SLAPI_PLUGIN_EXT_OP_FN, &tmpFunc); if ( rc != 0 ) { rc = LDAP_OTHER; goto error_return; } if ( (pTmpOIDs == NULL) || (tmpFunc == NULL) ) { rc = LDAP_OTHER; goto error_return; } for ( i = 0; pTmpOIDs[i] != NULL; i++ ) { pTmpExtOp->ext_oid.bv_val = pTmpOIDs[i]; pTmpExtOp->ext_oid.bv_len = strlen( pTmpOIDs[i] ); pTmpExtOp->ext_func = tmpFunc; pTmpExtOp->ext_be = pBE; if ( pTmpOIDs[i + 1] != NULL ) { pTmpExtOp->ext_next = createExtendedOp(); if ( pTmpExtOp->ext_next == NULL ) { rc = LDAP_NO_MEMORY; break; } pTmpExtOp = pTmpExtOp->ext_next; } }error_return: return rc;}/********************************************************************* * Function Name: slapi_int_get_extop_plugin * * Description: This routine gets the function address for a given function * name. * * Input: * funcName - name of the extended op function, ie. an OID. * * Output: pFuncAddr - the function address of the requested function name. * * Return Values: a pointer to a newly created ExtendOp structrue or * NULL - function failed * * Messages: None *********************************************************************/int slapi_int_get_extop_plugin( struct berval *reqoid, SLAPI_FUNC *pFuncAddr ) { ExtendedOp *pTmpExtOp; assert( reqoid != NULL ); assert( pFuncAddr != NULL ); *pFuncAddr = NULL; if ( pGExtendedOps == NULL ) { return LDAP_OTHER; } pTmpExtOp = pGExtendedOps; while ( pTmpExtOp != NULL ) { int rc; rc = strcasecmp( reqoid->bv_val, pTmpExtOp->ext_oid.bv_val ); if ( rc == 0 ) { *pFuncAddr = pTmpExtOp->ext_func; break; } pTmpExtOp = pTmpExtOp->ext_next; } return ( *pFuncAddr == NULL ? 1 : 0 );}/*************************************************************************** * 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 *slapi_int_get_supported_extop( int index ){ ExtendedOp *ext; for ( ext = pGExtendedOps ; ext != NULL && --index >= 0; ext = ext->ext_next) { ; /* empty */ } if ( ext == NULL ) { return NULL; } return &ext->ext_oid ;}/********************************************************************* * Function Name: slapi_int_load_plugin * * Description: This routine loads the specified DLL, gets and executes the init function * if requested. * * Input: * pPlugin - a pointer to a Slapi_PBlock struct which will be passed to * the DLL init function. * path - path name of the DLL to be load. * initfunc - either the DLL initialization function or an OID of the * loaded extended operation. * doInit - if it is TRUE, execute the init function, otherwise, save the * function address but not execute it. * * Output: pInitFunc - the function address of the loaded function. This param * should be not be null if doInit is FALSE. * pLdHandle - handle returned by lt_dlopen() * * Return Values: LDAP_SUCCESS, LDAP_LOCAL_ERROR * * Messages: None *********************************************************************/static int slapi_int_load_plugin( Slapi_PBlock *pPlugin, const char *path, const char *initfunc, int doInit, SLAPI_FUNC *pInitFunc, lt_dlhandle *pLdHandle ) { int rc = LDAP_SUCCESS; SLAPI_FUNC fpInitFunc = NULL; assert( pLdHandle != NULL ); if ( lt_dlinit() ) { return LDAP_LOCAL_ERROR; } /* load in the module */ *pLdHandle = lt_dlopen( path ); if ( *pLdHandle == NULL ) { fprintf( stderr, "failed to load plugin %s: %s\n", path, lt_dlerror() ); return LDAP_LOCAL_ERROR; } fpInitFunc = (SLAPI_FUNC)lt_dlsym( *pLdHandle, initfunc ); if ( fpInitFunc == NULL ) { fprintf( stderr, "failed to find symbol %s in plugin %s: %s\n", initfunc, path, lt_dlerror() ); lt_dlclose( *pLdHandle ); return LDAP_LOCAL_ERROR; } if ( doInit ) { rc = ( *fpInitFunc )( pPlugin ); if ( rc != LDAP_SUCCESS ) { lt_dlclose( *pLdHandle ); } } else { *pInitFunc = fpInitFunc; } return rc;}/* * Special support for computed attribute plugins */int slapi_int_call_plugins( Backend *be, int funcType, Slapi_PBlock *pPB ){ int rc = 0; SLAPI_FUNC *pGetPlugin = NULL, *tmpPlugin = NULL; if ( pPB == NULL ) { return 1; } rc = slapi_int_get_plugins( be, funcType, &tmpPlugin ); if ( rc != LDAP_SUCCESS || tmpPlugin == NULL ) { /* Nothing to do, front-end should ignore. */ return 1; } for ( pGetPlugin = tmpPlugin ; *pGetPlugin != NULL; pGetPlugin++ ) { rc = (*pGetPlugin)(pPB); /* * Only non-postoperation plugins abort processing on * failure (confirmed with SLAPI specification). */ if ( !SLAPI_PLUGIN_IS_POST_FN( funcType ) && rc != 0 ) { /* * Plugins generally return negative error codes * to indicate failure, although in the case of * bind plugins they may return SLAPI_BIND_xxx */ break; } } slapi_ch_free( (void **)&tmpPlugin ); return rc;}intslapi_int_read_config( Backend *be, const char *fname, int lineno, int argc, char **argv ){ int iType = -1; int numPluginArgc = 0; if ( argc < 4 ) { fprintf( stderr, "%s: line %d: missing arguments " "in \"plugin <plugin_type> <lib_path> " "<init_function> [<arguments>]\" line\n", fname, lineno ); return 1; } /* automatically instantiate overlay if necessary */ if ( !slapi_over_is_inst( be ) ) { if ( slapi_over_config( be ) != 0 ) { fprintf( stderr, "Failed to instantiate SLAPI overlay\n"); return -1; } } if ( strcasecmp( argv[1], "preoperation" ) == 0 ) { iType = SLAPI_PLUGIN_PREOPERATION; } else if ( strcasecmp( argv[1], "postoperation" ) == 0 ) { 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] ); return 1; } numPluginArgc = argc - 4; if ( iType == SLAPI_PLUGIN_PREOPERATION || iType == SLAPI_PLUGIN_EXTENDEDOP || iType == SLAPI_PLUGIN_POSTOPERATION || iType == SLAPI_PLUGIN_OBJECT ) { int rc; Slapi_PBlock *pPlugin; pPlugin = plugin_pblock_new( iType, numPluginArgc, argv ); if (pPlugin == NULL) { return 1; } if (iType == SLAPI_PLUGIN_EXTENDEDOP) { rc = slapi_int_register_extop(be, &pGExtendedOps, pPlugin); if ( rc != LDAP_SUCCESS ) { slapi_pblock_destroy( pPlugin ); return 1; } } rc = slapi_int_register_plugin( be, pPlugin ); if ( rc != LDAP_SUCCESS ) { if ( iType == SLAPI_PLUGIN_EXTENDEDOP ) { slapi_int_unregister_extop( be, &pGExtendedOps, pPlugin ); } slapi_pblock_destroy( pPlugin ); return 1; } } return 0;}voidslapi_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 = SLAPI_BACKEND_PBLOCK( be ); 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 ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -