⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin.c

📁 OpenLdap是LDAP的开源项目
💻 C
📖 第 1 页 / 共 2 页
字号:
 *********************************************************************/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 + -