summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/pblock.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/servers/slapd/pblock.c')
-rw-r--r--ldap/servers/slapd/pblock.c2930
1 files changed, 2930 insertions, 0 deletions
diff --git a/ldap/servers/slapd/pblock.c b/ldap/servers/slapd/pblock.c
new file mode 100644
index 00000000..d4431ddb
--- /dev/null
+++ b/ldap/servers/slapd/pblock.c
@@ -0,0 +1,2930 @@
+/** BEGIN COPYRIGHT BLOCK
+ * Copyright 2001 Sun Microsystems, Inc.
+ * Portions copyright 1999, 2001-2003 Netscape Communications Corporation.
+ * All rights reserved.
+ * END COPYRIGHT BLOCK **/
+
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include "slap.h"
+#include "cert.h"
+
+void
+pblock_init( Slapi_PBlock *pb )
+{
+ memset( pb, '\0', sizeof(Slapi_PBlock) );
+}
+
+void
+pblock_init_common(
+ Slapi_PBlock *pb,
+ Slapi_Backend *be,
+ Connection *conn,
+ Operation *op
+)
+{
+ PR_ASSERT( NULL != pb );
+ memset( pb, '\0', sizeof(Slapi_PBlock) );
+ pb->pb_backend = be;
+ pb->pb_conn = conn;
+ pb->pb_op = op;
+}
+
+void
+slapi_pblock_get_common(
+ Slapi_PBlock *pb,
+ Slapi_Backend **be,
+ Connection **conn,
+ Operation **op
+)
+{
+ PR_ASSERT( NULL != pb );
+ PR_ASSERT( NULL != be );
+ PR_ASSERT( NULL != conn );
+ PR_ASSERT( NULL != op );
+ *be = pb->pb_backend;
+ *conn = pb->pb_conn;
+ *op = pb->pb_op;
+}
+
+Slapi_PBlock *
+slapi_pblock_new()
+{
+ Slapi_PBlock *pb;
+
+ pb = (Slapi_PBlock *) slapi_ch_calloc( 1, sizeof(Slapi_PBlock) );
+ return pb;
+}
+
+void
+pblock_done( Slapi_PBlock *pb )
+{
+ if(pb->pb_op!=NULL)
+ {
+ operation_free(&pb->pb_op,pb->pb_conn);
+ }
+ slapi_ch_free((void**)&(pb->pb_result_text));
+}
+
+void
+slapi_pblock_destroy( Slapi_PBlock* pb )
+{
+ if(pb!=NULL)
+ {
+ pblock_done(pb);
+ slapi_ch_free((void**)&pb);
+ }
+}
+
+/* JCM - when pb_o_params is used, check the operation type. */
+/* JCM - when pb_o_results is used, check the operation type. */
+
+#define SLAPI_PLUGIN_TYPE_CHECK(PBLOCK,TYPE) \
+if ( PBLOCK ->pb_plugin->plg_type != TYPE) return( -1 )
+
+
+/*
+ * Macro used to safely retrieve a plugin related pblock value (if the
+ * pb_plugin element is NULL, NULL is returned).
+ */
+#define SLAPI_PBLOCK_GET_PLUGIN_RELATED_POINTER( pb, element ) \
+ ((pb)->pb_plugin == NULL ? NULL : (pb)->pb_plugin->element)
+
+
+int
+slapi_pblock_get( Slapi_PBlock *pblock, int arg, void *value )
+{
+ char *authtype;
+ Slapi_Backend *be;
+
+ PR_ASSERT( NULL != pblock );
+ PR_ASSERT( NULL != value );
+ be = pblock->pb_backend;
+
+ switch ( arg ) {
+ case SLAPI_BACKEND:
+ (*(Slapi_Backend **)value) = be;
+ break;
+ case SLAPI_BACKEND_COUNT:
+ (*(int *)value) = pblock->pb_backend_count;
+ break;
+ case SLAPI_BE_TYPE:
+ if ( NULL == be ) {
+ return( -1 );
+ }
+ (*(char **)value) = be->be_type;
+ break;
+ case SLAPI_BE_READONLY:
+ if ( NULL == be ) {
+ (*(int *)value) = 0; /* default value */
+ } else {
+ (*(int *)value) = be->be_readonly;
+ }
+ break;
+ case SLAPI_BE_LASTMOD:
+ if ( NULL == be ) {
+ (*(int *)value) = (g_get_global_lastmod() == LDAP_ON);
+ } else {
+ (*(int *)value) = (be->be_lastmod == LDAP_ON || (be->be_lastmod
+ == LDAP_UNDEFINED && g_get_global_lastmod() == LDAP_ON));
+ }
+ break;
+ case SLAPI_CONNECTION:
+ (*(Connection **)value) = pblock->pb_conn;
+ break;
+ case SLAPI_CONN_ID:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_ID \n", 0, 0, 0 );
+ return (-1);
+ }
+ (*(int *)value) = pblock->pb_conn->c_connid;
+ break;
+ case SLAPI_CONN_DN:
+ /*
+ * NOTE: we have to make a copy of this that the caller
+ * is responsible for freeing. otherwise, they would get
+ * a pointer that could be freed out from under them.
+ */
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_DN \n", 0, 0, 0 );
+ return (-1);
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ (*(char **)value) = (NULL == pblock->pb_conn->c_dn ? NULL :
+ slapi_ch_strdup( pblock->pb_conn->c_dn ));
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_AUTHTYPE:/* deprecated */
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_AUTHTYPE \n", 0, 0, 0 );
+ return (-1);
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ authtype = pblock->pb_conn->c_authtype;
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ if (authtype == NULL) {
+ (*(char **)value) = NULL;
+ } else if (strcasecmp(authtype, SLAPD_AUTH_NONE) == 0) {
+ (*(char **)value) = SLAPD_AUTH_NONE;
+ } else if (strcasecmp(authtype, SLAPD_AUTH_SIMPLE) == 0) {
+ (*(char **)value) = SLAPD_AUTH_SIMPLE;
+ } else if (strcasecmp(authtype, SLAPD_AUTH_SSL) == 0) {
+ (*(char **)value) = SLAPD_AUTH_SSL;
+ } else if (strncasecmp(authtype, SLAPD_AUTH_SASL,
+ strlen(SLAPD_AUTH_SASL)) == 0) {
+ (*(char **)value) = SLAPD_AUTH_SASL;
+ } else {
+ (*(char **)value) = "unknown";
+ }
+ break;
+ case SLAPI_CONN_AUTHMETHOD:
+ /* returns a copy */
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_AUTHMETHOD \n", 0, 0, 0 );
+ return (-1);
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ (*(char **)value) = pblock->pb_conn->c_authtype ?
+ slapi_ch_strdup(pblock->pb_conn->c_authtype) : NULL;
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_CLIENTNETADDR:
+ if (pblock->pb_conn == NULL)
+ {
+ memset( value, 0, sizeof( PRNetAddr ));
+ break;
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ if ( pblock->pb_conn->cin_addr == NULL ) {
+ memset( value, 0, sizeof( PRNetAddr ));
+ } else {
+ (*(PRNetAddr *)value) =
+ *(pblock->pb_conn->cin_addr);
+ }
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_SERVERNETADDR:
+ if (pblock->pb_conn == NULL)
+ {
+ memset( value, 0, sizeof( PRNetAddr ));
+ break;
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ if ( pblock->pb_conn->cin_destaddr == NULL ) {
+ memset( value, 0, sizeof( PRNetAddr ));
+ } else {
+ (*(PRNetAddr *)value) =
+ *(pblock->pb_conn->cin_destaddr);
+ }
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_CLIENTIP:
+ if (pblock->pb_conn == NULL)
+ {
+ memset( value, 0, sizeof( struct in_addr ));
+ break;
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ if ( pblock->pb_conn->cin_addr == NULL ) {
+ memset( value, 0, sizeof( struct in_addr ));
+ } else {
+
+ if ( PR_IsNetAddrType(pblock->pb_conn->cin_addr,
+ PR_IpAddrV4Mapped) ) {
+
+ (*(struct in_addr *)value).s_addr =
+ (*(pblock->pb_conn->cin_addr)).ipv6.ip.pr_s6_addr32[3];
+
+ } else {
+ memset( value, 0, sizeof( struct in_addr ));
+ }
+ }
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_SERVERIP:
+ if (pblock->pb_conn == NULL)
+ {
+ memset( value, 0, sizeof( struct in_addr ));
+ break;
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ if ( pblock->pb_conn->cin_destaddr == NULL ) {
+ memset( value, 0, sizeof( PRNetAddr ));
+ } else {
+
+ if ( PR_IsNetAddrType(pblock->pb_conn->cin_destaddr,
+ PR_IpAddrV4Mapped) ) {
+
+ (*(struct in_addr *)value).s_addr =
+ (*(pblock->pb_conn->cin_destaddr)).ipv6.ip.pr_s6_addr32[3];
+
+ } else {
+ memset( value, 0, sizeof( struct in_addr ));
+ }
+
+ }
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_IS_REPLICATION_SESSION:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_IS_REPLICATION_SESSION \n", 0, 0, 0 );
+ return (-1);
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ (*(int *)value) = pblock->pb_conn->c_isreplication_session;
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_IS_SSL_SESSION:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_IS_SSL_SESSION \n", 0, 0, 0 );
+ return (-1);
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ (*(int *)value) = pblock->pb_conn->c_flags & CONN_FLAG_SSL;
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_CERT:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_CERT \n", 0, 0, 0 );
+ return (-1);
+ }
+ ( *(CERTCertificate **) value) = pblock->pb_conn->c_client_cert;
+ break;
+ case SLAPI_OPERATION:
+ (*(Operation **)value) = pblock->pb_op;
+ break;
+ case SLAPI_OPERATION_TYPE:
+ (*(int *)value) = pblock->pb_op->o_params.operation_type;
+ break;
+ case SLAPI_OPINITIATED_TIME:
+ (*(int *)value) = pblock->pb_op->o_time;
+ break;
+ case SLAPI_REQUESTOR_ISROOT:
+ (*(int *)value) = pblock->pb_requestor_isroot;
+ break;
+ case SLAPI_IS_REPLICATED_OPERATION:
+ if(pblock->pb_op==NULL)
+ {
+ (*(int *)value) = 0; /* No Operation -> Not Replicated */
+ }
+ else
+ {
+ (*(int *)value) = (pblock->pb_op->o_flags & (OP_FLAG_REPLICATED | OP_FLAG_LEGACY_REPLICATION_DN));
+ }
+ break;
+ case SLAPI_IS_MMR_REPLICATED_OPERATION:
+ if(pblock->pb_op==NULL)
+ {
+ (*(int *)value) = 0; /* No Operation -> Not Replicated */
+ }
+ else
+ {
+ (*(int *)value) = (pblock->pb_op->o_flags & OP_FLAG_REPLICATED);
+ }
+ break;
+ case SLAPI_IS_LEGACY_REPLICATED_OPERATION:
+ if(pblock->pb_op==NULL)
+ {
+ (*(int *)value) = 0; /* No Operation -> Not Replicated */
+ }
+ else
+ {
+ (*(int *)value) = (pblock->pb_op->o_flags & OP_FLAG_LEGACY_REPLICATION_DN);
+ }
+ break;
+
+ case SLAPI_OPERATION_PARAMETERS:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct slapi_operation_parameters **)value) = &pblock->pb_op->o_params;
+ }
+ break;
+
+ /* stuff related to config file processing */
+ case SLAPI_CONFIG_FILENAME:
+ case SLAPI_CONFIG_LINENO:
+ case SLAPI_CONFIG_ARGC:
+ case SLAPI_CONFIG_ARGV:
+ return (-1); /* deprecated since DS 5.0 (no longer useful) */
+
+ /* pblock memory management */
+ case SLAPI_DESTROY_CONTENT:
+ (*(int *)value) = pblock->pb_destroy_content;
+ break;
+
+ /* stuff related to the current plugin */
+ case SLAPI_PLUGIN:
+ (*(struct slapdplugin **)value) = pblock->pb_plugin;
+ break;
+ case SLAPI_PLUGIN_PRIVATE:
+ (*(void **)value) = pblock->pb_plugin->plg_private;
+ break;
+ case SLAPI_PLUGIN_TYPE:
+ (*(int *)value) = pblock->pb_plugin->plg_type;
+ break;
+ case SLAPI_PLUGIN_ARGV:
+ (*(char ***)value) = pblock->pb_plugin->plg_argv;
+ break;
+ case SLAPI_PLUGIN_ARGC:
+ (*(int *)value) = pblock->pb_plugin->plg_argc;
+ break;
+ case SLAPI_PLUGIN_VERSION:
+ (*(char **)value) = pblock->pb_plugin->plg_version;
+ break;
+ case SLAPI_PLUGIN_OPRETURN:
+ (*(int *)value) = pblock->pb_opreturn;
+ break;
+ case SLAPI_PLUGIN_OBJECT:
+ (*(void **)value) = pblock->pb_object;
+ break;
+ case SLAPI_PLUGIN_DESTROY_FN:
+ (*(IFP*)value) = pblock->pb_destroy_fn;
+ break;
+ case SLAPI_PLUGIN_DESCRIPTION:
+ (*(Slapi_PluginDesc *)value) = pblock->pb_plugin->plg_desc;
+ break;
+ case SLAPI_PLUGIN_IDENTITY:
+ (*(void**)value) = pblock->pb_plugin_identity;
+ break;
+ case SLAPI_PLUGIN_INTOP_RESULT:
+ (*(int *)value) = pblock->pb_internal_op_result;
+ break;
+ case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES:
+ (*(Slapi_Entry ***)value) = pblock->pb_plugin_internal_search_op_entries;
+ break;
+ case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS:
+ (*(char ***)value) = pblock->pb_plugin_internal_search_op_referrals;
+ break;
+
+ /* database plugin functions */
+ case SLAPI_PLUGIN_DB_BIND_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bind;
+ break;
+ case SLAPI_PLUGIN_DB_UNBIND_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_unbind;
+ break;
+ case SLAPI_PLUGIN_DB_SEARCH_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_search;
+ break;
+ case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_next_search_entry;
+ break;
+ case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_EXT_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_next_search_entry_ext;
+ break;
+ case SLAPI_PLUGIN_DB_ENTRY_RELEASE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_entry_release;
+ break;
+ case SLAPI_PLUGIN_DB_COMPARE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_compare;
+ break;
+ case SLAPI_PLUGIN_DB_MODIFY_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_modify;
+ break;
+ case SLAPI_PLUGIN_DB_MODRDN_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_modrdn;
+ break;
+ case SLAPI_PLUGIN_DB_ADD_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_add;
+ break;
+ case SLAPI_PLUGIN_DB_DELETE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_delete;
+ break;
+ case SLAPI_PLUGIN_DB_ABANDON_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_abandon;
+ break;
+ case SLAPI_PLUGIN_DB_CONFIG_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_config;
+ break;
+ case SLAPI_PLUGIN_CLOSE_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_close;
+ break;
+ case SLAPI_PLUGIN_CLEANUP_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_cleanup;
+ break;
+ case SLAPI_PLUGIN_DB_FLUSH_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_flush;
+ break;
+ case SLAPI_PLUGIN_START_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_start;
+ break;
+ case SLAPI_PLUGIN_POSTSTART_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_poststart;
+ break;
+ case SLAPI_PLUGIN_DB_WIRE_IMPORT_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_wire_import;
+ break;
+ case SLAPI_PLUGIN_DB_SEQ_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_seq;
+ break;
+ case SLAPI_PLUGIN_DB_ENTRY_FN:
+ (*(IFP *)value) = SLAPI_PBLOCK_GET_PLUGIN_RELATED_POINTER( pblock,
+ plg_entry );
+ break;
+ case SLAPI_PLUGIN_DB_REFERRAL_FN:
+ (*(IFP *)value) = SLAPI_PBLOCK_GET_PLUGIN_RELATED_POINTER( pblock,
+ plg_referral );
+ break;
+ case SLAPI_PLUGIN_DB_RESULT_FN:
+ (*(IFP *)value) = SLAPI_PBLOCK_GET_PLUGIN_RELATED_POINTER( pblock,
+ plg_result );
+ break;
+ case SLAPI_PLUGIN_DB_RMDB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_rmdb;
+ break;
+ case SLAPI_PLUGIN_DB_INIT_INSTANCE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_init_instance;
+ break;
+ case SLAPI_PLUGIN_DB_LDIF2DB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_ldif2db;
+ break;
+ case SLAPI_PLUGIN_DB_DB2LDIF_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_db2ldif;
+ break;
+ case SLAPI_PLUGIN_DB_DB2INDEX_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_db2index;
+ break;
+ case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_archive2db;
+ break;
+ case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_db2archive;
+ break;
+#if defined(UPGRADEDB)
+ case SLAPI_PLUGIN_DB_UPGRADEDB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_upgradedb;
+ break;
+#endif
+ case SLAPI_PLUGIN_DB_BEGIN_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_begin;
+ break;
+ case SLAPI_PLUGIN_DB_COMMIT_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_commit;
+ break;
+ case SLAPI_PLUGIN_DB_ABORT_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_abort;
+ break;
+ case SLAPI_PLUGIN_DB_SIZE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_dbsize;
+ break;
+ case SLAPI_PLUGIN_DB_TEST_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_dbtest;
+ break;
+ /* database plugin-specific parameters */
+ case SLAPI_PLUGIN_DB_NO_ACL:
+ if ( pblock->pb_plugin && pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ if ( NULL == be ) {
+ (*(int *)value) = 0; /* default value */
+ } else {
+ (*(int *)value) = be->be_noacl;
+ }
+ break;
+
+ /* extendedop plugin functions */
+ case SLAPI_PLUGIN_EXT_OP_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_EXTENDEDOP ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_exhandler;
+ break;
+ case SLAPI_PLUGIN_EXT_OP_OIDLIST:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_EXTENDEDOP ) {
+ return( -1 );
+ }
+ (*(char ***)value) = pblock->pb_plugin->plg_exoids;
+ break;
+ case SLAPI_PLUGIN_EXT_OP_NAMELIST:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_EXTENDEDOP ) {
+ return( -1 );
+ }
+ (*(char ***)value) = pblock->pb_plugin->plg_exnames;
+ break;
+
+ /* preoperation plugin functions */
+ case SLAPI_PLUGIN_PRE_BIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_prebind;
+ break;
+ case SLAPI_PLUGIN_PRE_UNBIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_preunbind;
+ break;
+ case SLAPI_PLUGIN_PRE_SEARCH_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_presearch;
+ break;
+ case SLAPI_PLUGIN_PRE_COMPARE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_precompare;
+ break;
+ case SLAPI_PLUGIN_PRE_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_premodify;
+ break;
+ case SLAPI_PLUGIN_PRE_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_premodrdn;
+ break;
+ case SLAPI_PLUGIN_PRE_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_preadd;
+ break;
+ case SLAPI_PLUGIN_PRE_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_predelete;
+ break;
+ case SLAPI_PLUGIN_PRE_ABANDON_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_preabandon;
+ break;
+ case SLAPI_PLUGIN_PRE_ENTRY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_preentry;
+ break;
+ case SLAPI_PLUGIN_PRE_REFERRAL_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_prereferral;
+ break;
+ case SLAPI_PLUGIN_PRE_RESULT_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_preresult;
+ break;
+
+ /* postoperation plugin functions */
+ case SLAPI_PLUGIN_POST_BIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postbind;
+ break;
+ case SLAPI_PLUGIN_POST_UNBIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postunbind;
+ break;
+ case SLAPI_PLUGIN_POST_SEARCH_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postsearch;
+ break;
+ case SLAPI_PLUGIN_POST_SEARCH_FAIL_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postsearchfail;
+ break;
+ case SLAPI_PLUGIN_POST_COMPARE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postcompare;
+ break;
+ case SLAPI_PLUGIN_POST_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postmodify;
+ break;
+ case SLAPI_PLUGIN_POST_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postmodrdn;
+ break;
+ case SLAPI_PLUGIN_POST_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postadd;
+ break;
+ case SLAPI_PLUGIN_POST_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postdelete;
+ break;
+ case SLAPI_PLUGIN_POST_ABANDON_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postabandon;
+ break;
+ case SLAPI_PLUGIN_POST_ENTRY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postentry;
+ break;
+ case SLAPI_PLUGIN_POST_REFERRAL_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postreferral;
+ break;
+ case SLAPI_PLUGIN_POST_RESULT_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_postresult;
+ break;
+
+ case SLAPI_ENTRY_PRE_OP:
+ (*(Slapi_Entry **)value) = pblock->pb_pre_op_entry;
+ break;
+ case SLAPI_ENTRY_POST_OP:
+ (*(Slapi_Entry **)value) = pblock->pb_post_op_entry;
+ break;
+
+ /* backend preoperation plugin */
+ case SLAPI_PLUGIN_BE_PRE_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepremodify;
+ break;
+ case SLAPI_PLUGIN_BE_PRE_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepremodrdn;
+ break;
+ case SLAPI_PLUGIN_BE_PRE_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepreadd;
+ break;
+ case SLAPI_PLUGIN_BE_PRE_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepredelete;
+ break;
+
+ /* backend postoperation plugin */
+ case SLAPI_PLUGIN_BE_POST_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepostmodify;
+ break;
+ case SLAPI_PLUGIN_BE_POST_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepostmodrdn;
+ break;
+ case SLAPI_PLUGIN_BE_POST_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepostadd;
+ break;
+ case SLAPI_PLUGIN_BE_POST_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_bepostdelete;
+ break;
+
+ /* internal preoperation plugin */
+ case SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_pre_modify;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_pre_modrdn;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_pre_add;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_pre_delete;
+ break;
+
+ /* internal postoperation plugin */
+ case SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_post_modify;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_post_modrdn;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_POST_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_post_add;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_internal_post_delete;
+ break;
+
+ /* target address & controls for all operations should be normalized */
+ case SLAPI_TARGET_ADDRESS:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(entry_address **)value) = &(pblock->pb_op->o_params.target_address);
+ }
+ break;
+ /* should be normalized */
+ case SLAPI_TARGET_DN:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.target_address.dn;
+ }
+ break;
+ case SLAPI_ORIGINAL_TARGET_DN:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.target_address.udn;
+ }
+ break;
+ case SLAPI_TARGET_UNIQUEID:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.target_address.uniqueid;
+ }
+ break;
+ case SLAPI_REQCONTROLS:
+ (*(LDAPControl ***)value) = pblock->pb_op->o_params.request_controls;
+ break;
+ case SLAPI_RESCONTROLS:
+ (*(LDAPControl ***)value) = pblock->pb_op->o_results.result_controls;
+ break;
+ case SLAPI_CONTROLS_ARG: /* used to pass control argument before operation is created */
+ (*(LDAPControl ***)value) = pblock->pb_ctrls_arg;
+ break;
+ /* notes to be added to the access log RESULT line for this op. */
+ case SLAPI_OPERATION_NOTES:
+ (*(unsigned int *)value) = pblock->pb_operation_notes;
+ break;
+
+ /* syntax plugin functions */
+ case SLAPI_PLUGIN_SYNTAX_FILTER_AVA:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_syntax_filter_ava;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_FILTER_SUB:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_syntax_filter_sub;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_syntax_values2keys;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_syntax_assertion2keys_ava;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_syntax_assertion2keys_sub;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_NAMES:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(char ***)value) = pblock->pb_plugin->plg_syntax_names;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_OID:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(char **)value) = pblock->pb_plugin->plg_syntax_oid;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_FLAGS:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(int *)value) = pblock->pb_plugin->plg_syntax_flags;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_COMPARE:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ (*(IFP *)value) = pblock->pb_plugin->plg_syntax_compare;
+ break;
+
+ /* controls we know about */
+ case SLAPI_MANAGEDSAIT:
+ (*(int *)value) = pblock->pb_managedsait;
+ break;
+ case SLAPI_PWPOLICY:
+ (*(int *)value) = pblock->pb_pwpolicy_ctrl;
+ break;
+
+ /* add arguments */
+ case SLAPI_ADD_ENTRY:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(Slapi_Entry **)value) = pblock->pb_op->o_params.p.p_add.target_entry;
+ }
+ break;
+ case SLAPI_ADD_EXISTING_DN_ENTRY:
+ (*(Slapi_Entry **)value) = pblock->pb_existing_dn_entry;
+ break;
+ case SLAPI_ADD_EXISTING_UNIQUEID_ENTRY:
+ (*(Slapi_Entry **)value) = pblock->pb_existing_uniqueid_entry;
+ break;
+ case SLAPI_ADD_PARENT_ENTRY:
+ (*(Slapi_Entry **)value) = pblock->pb_parent_entry;
+ break;
+ case SLAPI_ADD_PARENT_UNIQUEID:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.p.p_add.parentuniqueid;
+ }
+ break;
+
+ /* bind arguments */
+ case SLAPI_BIND_METHOD:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_bind.bind_method;
+ }
+ break;
+ case SLAPI_BIND_CREDENTIALS:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct berval **)value) = pblock->pb_op->o_params.p.p_bind.bind_creds;
+ }
+ break;
+ case SLAPI_BIND_SASLMECHANISM:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.p.p_bind.bind_saslmechanism;
+ }
+ break;
+ /* bind return values */
+ case SLAPI_BIND_RET_SASLCREDS:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct berval **)value) = pblock->pb_op->o_results.r.r_bind.bind_ret_saslcreds;
+ }
+ break;
+
+ /* compare arguments */
+ case SLAPI_COMPARE_TYPE:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.p.p_compare.compare_ava.ava_type;
+ }
+ break;
+ case SLAPI_COMPARE_VALUE:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct berval **)value) = &pblock->pb_op->o_params.p.p_compare.compare_ava.ava_value;
+ }
+ break;
+
+ /* modify arguments */
+ case SLAPI_MODIFY_MODS:
+ PR_ASSERT(pblock->pb_op);
+ if(pblock->pb_op!=NULL)
+ {
+ if(pblock->pb_op->o_params.operation_type==SLAPI_OPERATION_MODIFY)
+ {
+ (*(LDAPMod ***)value) = pblock->pb_op->o_params.p.p_modify.modify_mods;
+ }
+ else if(pblock->pb_op->o_params.operation_type==SLAPI_OPERATION_MODRDN)
+ {
+ (*(LDAPMod ***)value) = pblock->pb_op->o_params.p.p_modrdn.modrdn_mods;
+ }
+ else
+ {
+ PR_ASSERT(0); /* JCM */
+ }
+ }
+ break;
+
+ /* modrdn arguments */
+ case SLAPI_MODRDN_NEWRDN:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.p.p_modrdn.modrdn_newrdn;
+ }
+ break;
+ case SLAPI_MODRDN_DELOLDRDN:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_modrdn.modrdn_deloldrdn;
+ }
+ break;
+ case SLAPI_MODRDN_NEWSUPERIOR:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) =
+ pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.dn;
+ }
+ break;
+ case SLAPI_MODRDN_PARENT_ENTRY:
+ (*(Slapi_Entry **)value) = pblock->pb_parent_entry;
+ break;
+ case SLAPI_MODRDN_NEWPARENT_ENTRY:
+ (*(Slapi_Entry **)value) = pblock->pb_newparent_entry;
+ break;
+ case SLAPI_MODRDN_TARGET_ENTRY:
+ (*(Slapi_Entry **)value) = pblock->pb_target_entry;
+ break;
+ case SLAPI_MODRDN_NEWSUPERIOR_ADDRESS:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(entry_address **)value) = &(pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address);
+ break;
+ }
+
+ /* search arguments */
+ case SLAPI_SEARCH_SCOPE:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_search.search_scope;
+ }
+ break;
+ case SLAPI_SEARCH_DEREF:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_search.search_deref;
+ }
+ break;
+ case SLAPI_SEARCH_SIZELIMIT:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_search.search_sizelimit;
+ }
+ break;
+ case SLAPI_SEARCH_TIMELIMIT:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_search.search_timelimit;
+ }
+ break;
+ case SLAPI_SEARCH_FILTER:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct slapi_filter **)value) = pblock->pb_op->o_params.p.p_search.search_filter;
+ }
+ break;
+ case SLAPI_SEARCH_STRFILTER:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **)value) = pblock->pb_op->o_params.p.p_search.search_strfilter;
+ }
+ break;
+ case SLAPI_SEARCH_ATTRS:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char ***)value) = pblock->pb_op->o_params.p.p_search.search_attrs;
+ }
+ break;
+ case SLAPI_SEARCH_ATTRSONLY:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_search.search_attrsonly;
+ }
+ break;
+ case SLAPI_SEARCH_IS_AND:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_search.search_is_and;
+ }
+ break;
+
+ case SLAPI_ABANDON_MSGID:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_params.p.p_abandon.abandon_targetmsgid;
+ }
+ break;
+
+ /* extended operation arguments */
+ case SLAPI_EXT_OP_REQ_OID:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **) value) = pblock->pb_op->o_params.p.p_extended.exop_oid;
+ }
+ break;
+ case SLAPI_EXT_OP_REQ_VALUE:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct berval **)value) = pblock->pb_op->o_params.p.p_extended.exop_value;
+ }
+ break;
+ /* extended operation return values */
+ case SLAPI_EXT_OP_RET_OID:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(char **) value) = pblock->pb_op->o_results.r.r_extended.exop_ret_oid;
+ }
+ break;
+ case SLAPI_EXT_OP_RET_VALUE:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct berval **)value) = pblock->pb_op->o_results.r.r_extended.exop_ret_value;
+ }
+ break;
+
+ /* matching rule plugin functions */
+ case SLAPI_PLUGIN_MR_FILTER_CREATE_FN:
+ SLAPI_PLUGIN_TYPE_CHECK (pblock, SLAPI_PLUGIN_MATCHINGRULE);
+ (*(IFP *)value) = pblock->pb_plugin->plg_mr_filter_create;
+ break;
+ case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN:
+ SLAPI_PLUGIN_TYPE_CHECK (pblock, SLAPI_PLUGIN_MATCHINGRULE);
+ (*(IFP *)value) = pblock->pb_plugin->plg_mr_indexer_create;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_MATCH_FN:
+ (*(mrFilterMatchFn *)value) = pblock->pb_mr_filter_match_fn;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_INDEX_FN:
+ (*(IFP *)value) = pblock->pb_mr_filter_index_fn;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_RESET_FN:
+ (*(IFP *)value) = pblock->pb_mr_filter_reset_fn;
+ break;
+ case SLAPI_PLUGIN_MR_INDEX_FN:
+ (*(IFP *)value) = pblock->pb_mr_index_fn;
+ break;
+
+ /* matching rule plugin arguments */
+ case SLAPI_PLUGIN_MR_OID:
+ (*(char **) value) = pblock->pb_mr_oid;
+ break;
+ case SLAPI_PLUGIN_MR_TYPE:
+ (*(char **) value) = pblock->pb_mr_type;
+ break;
+ case SLAPI_PLUGIN_MR_VALUE:
+ (*(struct berval **) value) = pblock->pb_mr_value;
+ break;
+ case SLAPI_PLUGIN_MR_VALUES:
+ (*(struct berval ***) value) = pblock->pb_mr_values;
+ break;
+ case SLAPI_PLUGIN_MR_KEYS:
+ (*(struct berval ***) value) = pblock->pb_mr_keys;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_REUSABLE:
+ (*(unsigned int *) value) = pblock->pb_mr_filter_reusable;
+ break;
+ case SLAPI_PLUGIN_MR_QUERY_OPERATOR:
+ (*(int *) value) = pblock->pb_mr_query_operator;
+ break;
+ case SLAPI_PLUGIN_MR_USAGE:
+ (*(unsigned int *) value) = pblock->pb_mr_usage;
+ break;
+
+ /* seq arguments */
+ case SLAPI_SEQ_TYPE:
+ (*(int *)value) = pblock->pb_seq_type;
+ break;
+ case SLAPI_SEQ_ATTRNAME:
+ (*(char **)value) = pblock->pb_seq_attrname;
+ break;
+ case SLAPI_SEQ_VAL:
+ (*(char **)value) = pblock->pb_seq_val;
+ break;
+
+ /* ldif2db arguments */
+ case SLAPI_LDIF2DB_FILE:
+ (*(char ***)value) = pblock->pb_ldif_files;
+ break;
+ case SLAPI_LDIF2DB_REMOVEDUPVALS:
+ (*(int *)value) = pblock->pb_removedupvals;
+ break;
+ case SLAPI_DB2INDEX_ATTRS:
+ (*(char ***)value) = pblock->pb_db2index_attrs;
+ break;
+ case SLAPI_LDIF2DB_NOATTRINDEXES:
+ (*(int *)value) = pblock->pb_ldif2db_noattrindexes;
+ break;
+ case SLAPI_LDIF2DB_INCLUDE:
+ (*(char ***)value) = pblock->pb_ldif_include;
+ break;
+ case SLAPI_LDIF2DB_EXCLUDE:
+ (*(char ***)value) = pblock->pb_ldif_exclude;
+ break;
+ case SLAPI_LDIF2DB_GENERATE_UNIQUEID:
+ (*(int *)value) = pblock->pb_ldif_generate_uniqueid;
+ break;
+ case SLAPI_LDIF2DB_ENCRYPT:
+ case SLAPI_DB2LDIF_DECRYPT:
+ (*(int *)value) = pblock->pb_ldif_encrypt;
+ break;
+ case SLAPI_LDIF2DB_NAMESPACEID:
+ (*(char **)value) = pblock->pb_ldif_namespaceid;
+ break;
+
+ /* db2ldif arguments */
+ case SLAPI_DB2LDIF_PRINTKEY:
+ (*(int *)value) = pblock->pb_ldif_printkey;
+ break;
+ case SLAPI_DB2LDIF_DUMP_UNIQUEID:
+ (*(int *)value) = pblock->pb_ldif_dump_uniqueid;
+ break;
+ case SLAPI_DB2LDIF_FILE:
+ (*(char **)value) = pblock->pb_ldif_file;
+ break;
+
+ /* db2ldif/ldif2db/db2bak/bak2db arguments */
+ case SLAPI_BACKEND_INSTANCE_NAME:
+ (*(char **)value) = pblock->pb_instance_name;
+ break;
+ case SLAPI_BACKEND_TASK:
+ (*(Slapi_Task **)value) = pblock->pb_task;
+ break;
+ case SLAPI_TASK_FLAGS:
+ (*(int *)value) = pblock->pb_task_flags;
+ break;
+ case SLAPI_DB2LDIF_SERVER_RUNNING:
+ (*(int *)value) = pblock->pb_server_running;
+ break;
+ case SLAPI_BULK_IMPORT_ENTRY:
+ (*(Slapi_Entry **)value) = pblock->pb_import_entry;
+ break;
+ case SLAPI_BULK_IMPORT_STATE:
+ (*(int *)value) = pblock->pb_import_state;
+ break;
+
+ /* transaction arguments */
+ case SLAPI_PARENT_TXN:
+ (*(void **)value) = pblock->pb_parent_txn;
+ break;
+ case SLAPI_TXN:
+ (*(void **)value) = pblock->pb_txn;
+ break;
+
+ /* Search results set */
+ case SLAPI_SEARCH_RESULT_SET:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(void **)value) = pblock->pb_op->o_results.r.r_search.search_result_set;
+ }
+ break;
+ /* Entry returned from iterating over results set */
+ case SLAPI_SEARCH_RESULT_ENTRY:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(void **)value) = pblock->pb_op->o_results.r.r_search.search_result_entry;
+ }
+ break;
+ case SLAPI_SEARCH_RESULT_ENTRY_EXT:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(void **)value) = pblock->pb_op->o_results.r.r_search.opaque_backend_ptr;
+ }
+ break;
+ /* Number of entries returned from search */
+ case SLAPI_NENTRIES:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(int *)value) = pblock->pb_op->o_results.r.r_search.nentries;
+ }
+ break;
+ /* Referrals encountered while iterating over result set */
+ case SLAPI_SEARCH_REFERRALS:
+ if(pblock->pb_op!=NULL)
+ {
+ (*(struct berval ***)value) = pblock->pb_op->o_results.r.r_search.search_referrals;
+ }
+ break;
+
+ case SLAPI_RESULT_CODE:
+ if (pblock->pb_op != NULL)
+ * ((int *) value) = pblock->pb_op->o_results.result_code;
+ break;
+ case SLAPI_RESULT_MATCHED:
+ if (pblock->pb_op != NULL)
+ * ((char **) value) = pblock->pb_op->o_results.result_matched;
+ break;
+ case SLAPI_RESULT_TEXT:
+ if (pblock->pb_op != NULL)
+ * ((char **) value) = pblock->pb_op->o_results.result_text;
+ break;
+ case SLAPI_PB_RESULT_TEXT:
+ * ((char **) value) = pblock->pb_result_text;
+ break;
+
+ /* Size of the database, in kb */
+ case SLAPI_DBSIZE:
+ (*(unsigned int *)value) = pblock->pb_dbsize;
+ break;
+
+ /* ACL Plugin */
+ case SLAPI_PLUGIN_ACL_INIT:
+ (*(IFP *)value) = pblock->pb_plugin->plg_acl_init;
+ break;
+ case SLAPI_PLUGIN_ACL_SYNTAX_CHECK:
+ (*(IFP *)value) = pblock->pb_plugin->plg_acl_syntax_check;
+ break;
+ case SLAPI_PLUGIN_ACL_ALLOW_ACCESS:
+ (*(IFP *)value) = pblock->pb_plugin->plg_acl_access_allowed;
+ break;
+ case SLAPI_PLUGIN_ACL_MODS_ALLOWED:
+ (*(IFP *)value) = pblock->pb_plugin->plg_acl_mods_allowed;
+ break;
+ case SLAPI_PLUGIN_ACL_MODS_UPDATE:
+ (*(IFP *)value) = pblock->pb_plugin->plg_acl_mods_update;
+ break;
+
+ case SLAPI_REQUESTOR_DN:
+ /* NOTE: It's not a copy of the DN */
+ {
+ char *dn= (char*)slapi_sdn_get_dn(&pblock->pb_op->o_sdn);
+ if(dn==NULL)
+ (*( char **)value ) = "";
+ else
+ (*( char **)value ) = dn;
+ }
+ break;
+
+ case SLAPI_OPERATION_AUTHTYPE:
+ if(pblock->pb_op->o_authtype==NULL)
+ (*( char **)value ) = "";
+ else
+ (*( char **)value ) = pblock->pb_op->o_authtype;
+ break;
+
+ case SLAPI_CLIENT_DNS:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CLIENT_DNS \n", 0, 0, 0 );
+ return (-1);
+ }
+ (*(struct berval ***)value ) = pblock->pb_conn->c_domain;
+ break;
+
+ case SLAPI_BE_MAXNESTLEVEL:
+ if ( NULL == be ) {
+ return( -1 );
+ }
+ (*(int *)value ) = be->be_maxnestlevel;
+ break;
+ case SLAPI_OPERATION_ID:
+ (*(int *)value ) = pblock->pb_op->o_opid;
+ break;
+ /* Command line arguments */
+ case SLAPI_ARGC:
+ (*(int *)value) = pblock->pb_slapd_argc;
+ break;
+ case SLAPI_ARGV:
+ (*(char ***)value) = pblock->pb_slapd_argv;
+ break;
+
+ /* Config file directory */
+ case SLAPI_CONFIG_DIRECTORY:
+ (*(char **)value) = pblock->pb_slapd_configdir;
+ break;
+
+ /* password storage scheme (kexcoff */
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_NAME:
+ (*(char **)value) = pblock->pb_plugin->plg_pwdstorageschemename;
+ break;
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_USER_PWD:
+ (*(char **)value) = pblock->pb_pwd_storage_scheme_user_passwd;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DB_PWD:
+ (*(char **)value) = pblock->pb_pwd_storage_scheme_db_passwd;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_ENC_FN:
+ (*(CFP *)value) = pblock->pb_plugin->plg_pwdstorageschemeenc;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DEC_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_pwdstorageschemedec;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_CMP_FN:
+ (*(IFP *)value) = pblock->pb_plugin->plg_pwdstorageschemecmp;
+ break;
+
+ /* entry fetch/store plugin */
+ case SLAPI_PLUGIN_ENTRY_FETCH_FUNC:
+ (*(IFP *)value) = pblock->pb_plugin->plg_entryfetchfunc;
+ break;
+
+ case SLAPI_PLUGIN_ENTRY_STORE_FUNC:
+ (*(IFP *)value) = pblock->pb_plugin->plg_entrystorefunc;
+ break;
+
+ /* DSE add parameters */
+ case SLAPI_DSE_DONT_WRITE_WHEN_ADDING:
+ (*(int *)value) = pblock->pb_dse_dont_add_write;
+ break;
+
+ /* DSE add parameters */
+ case SLAPI_DSE_MERGE_WHEN_ADDING:
+ (*(int *)value) = pblock->pb_dse_add_merge;
+ break;
+
+ /* DSE add parameters */
+ case SLAPI_DSE_DONT_CHECK_DUPS:
+ (*(int *)value) = pblock->pb_dse_dont_check_dups;
+ break;
+
+ /* DSE modify parameters */
+ case SLAPI_DSE_REAPPLY_MODS:
+ (*(int *)value) = pblock->pb_dse_reapply_mods;
+ break;
+
+ /* DSE read parameters */
+ case SLAPI_DSE_IS_PRIMARY_FILE:
+ (*(int *)value) = pblock->pb_dse_is_primary_file;
+ break;
+
+ /* used internally by schema code */
+ case SLAPI_SCHEMA_USER_DEFINED_ONLY:
+ (*(int *)value) = pblock->pb_schema_user_defined_only;
+ break;
+
+ case SLAPI_URP_NAMING_COLLISION_DN:
+ (*(char **)value) = pblock->pb_urp_naming_collision_dn;
+ break;
+
+ case SLAPI_URP_TOMBSTONE_UNIQUEID:
+ (*(char **)value) = pblock->pb_urp_tombstone_uniqueid;
+ break;
+
+ default:
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Unknown parameter block argument %d\n", arg, 0, 0 );
+ return( -1 );
+ }
+
+ return( 0 );
+}
+
+int
+slapi_pblock_set( Slapi_PBlock *pblock, int arg, void *value )
+{
+ char *authtype;
+
+ PR_ASSERT( NULL != pblock );
+
+ switch ( arg ) {
+ case SLAPI_BACKEND:
+ pblock->pb_backend = (Slapi_Backend *) value;
+ break;
+ case SLAPI_BACKEND_COUNT:
+ pblock->pb_backend_count = *((int *) value);
+ break;
+ case SLAPI_CONNECTION:
+ pblock->pb_conn = (Connection *) value;
+ break;
+ case SLAPI_OPERATION:
+ pblock->pb_op = (Operation *) value;
+ break;
+ case SLAPI_OPINITIATED_TIME:
+ pblock->pb_op->o_time = *((time_t *) value);
+ break;
+ case SLAPI_REQUESTOR_ISROOT:
+ pblock->pb_requestor_isroot = *((int *) value);
+ break;
+ case SLAPI_IS_REPLICATED_OPERATION:
+ PR_ASSERT(0);
+ break;
+ case SLAPI_OPERATION_PARAMETERS:
+ PR_ASSERT(0);
+ break;
+ case SLAPI_CONN_ID:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_ID \n", 0, 0, 0 );
+ return (-1);
+ }
+ pblock->pb_conn->c_connid = *((int *) value);
+ break;
+ case SLAPI_CONN_DN:
+ /*
+ * Slightly crazy but we must pass a copy of the current
+ * authtype into bind_credentials_set() since it will
+ * free the current authtype.
+ */
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_DN \n", 0, 0, 0 );
+ return (-1);
+ }
+ slapi_pblock_get(pblock, SLAPI_CONN_AUTHMETHOD, &authtype);
+ bind_credentials_set( pblock->pb_conn, authtype,
+ (char *)value, NULL, NULL, NULL , NULL);
+ slapi_ch_free((void**)&authtype);
+ break;
+ case SLAPI_CONN_AUTHTYPE: /* deprecated */
+ case SLAPI_CONN_AUTHMETHOD:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_AUTHMETHOD \n", 0, 0, 0 );
+ return (-1);
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ slapi_ch_free((void**)&pblock->pb_conn->c_authtype);
+ pblock->pb_conn->c_authtype = slapi_ch_strdup((char *) value);
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+ case SLAPI_CONN_IS_REPLICATION_SESSION:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CONN_IS_REPLICATION_SESSION \n", 0, 0, 0 );
+ return (-1);
+ }
+ PR_Lock( pblock->pb_conn->c_mutex );
+ pblock->pb_conn->c_isreplication_session = *((int *) value);
+ PR_Unlock( pblock->pb_conn->c_mutex );
+ break;
+
+ /* stuff related to config file processing */
+ case SLAPI_CONFIG_FILENAME:
+ case SLAPI_CONFIG_LINENO:
+ case SLAPI_CONFIG_ARGC:
+ case SLAPI_CONFIG_ARGV:
+ return (-1); /* deprecated since DS 5.0 (no longer useful) */
+
+ /* pblock memory management */
+ case SLAPI_DESTROY_CONTENT:
+ pblock->pb_destroy_content = *((int *) value);
+ break;
+
+ /* stuff related to the current plugin */
+ case SLAPI_PLUGIN:
+ pblock->pb_plugin = (struct slapdplugin *) value;
+ break;
+ case SLAPI_PLUGIN_PRIVATE:
+ pblock->pb_plugin->plg_private = (void *) value;
+ break;
+ case SLAPI_PLUGIN_TYPE:
+ pblock->pb_plugin->plg_type = *((int *) value);
+ break;
+ case SLAPI_PLUGIN_ARGV:
+ pblock->pb_plugin->plg_argv = (char **) value;
+ break;
+ case SLAPI_PLUGIN_ARGC:
+ pblock->pb_plugin->plg_argc = *((int *) value);
+ break;
+ case SLAPI_PLUGIN_VERSION:
+ pblock->pb_plugin->plg_version = (char *) value;
+ break;
+ case SLAPI_PLUGIN_OPRETURN:
+ pblock->pb_opreturn = *((int *) value);
+ break;
+ case SLAPI_PLUGIN_OBJECT:
+ pblock->pb_object = (void *) value;
+ break;
+ case SLAPI_PLUGIN_IDENTITY:
+ pblock->pb_plugin_identity = (void*)value;
+ break;
+ case SLAPI_PLUGIN_DESTROY_FN:
+ pblock->pb_destroy_fn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DESCRIPTION:
+ pblock->pb_plugin->plg_desc = *((Slapi_PluginDesc *)value);
+ break;
+ case SLAPI_PLUGIN_INTOP_RESULT:
+ pblock->pb_internal_op_result = *((int *) value);
+ break;
+ case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES:
+ pblock->pb_plugin_internal_search_op_entries = (Slapi_Entry **) value;
+ break;
+ case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS:
+ pblock->pb_plugin_internal_search_op_referrals = (char **) value;
+ break;
+ /* database plugin functions */
+ case SLAPI_PLUGIN_DB_BIND_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bind = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_UNBIND_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_unbind = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_SEARCH_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_search = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_next_search_entry = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_EXT_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_next_search_entry_ext = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_ENTRY_RELEASE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_entry_release = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_COMPARE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_compare = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_MODIFY_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_modify = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_MODRDN_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_modrdn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_ADD_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_add = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_DELETE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_delete = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_ABANDON_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_abandon = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_CONFIG_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_config = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_CLOSE_FN:
+ pblock->pb_plugin->plg_close = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_CLEANUP_FN:
+ pblock->pb_plugin->plg_cleanup = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_FLUSH_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_flush = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_START_FN:
+ pblock->pb_plugin->plg_start = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POSTSTART_FN:
+ pblock->pb_plugin->plg_poststart = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_WIRE_IMPORT_FN:
+ pblock->pb_plugin->plg_wire_import = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_SEQ_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_seq = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_ENTRY_FN:
+ pblock->pb_plugin->plg_entry = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_REFERRAL_FN:
+ pblock->pb_plugin->plg_referral = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_RESULT_FN:
+ pblock->pb_plugin->plg_result = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_RMDB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_rmdb = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_INIT_INSTANCE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_init_instance = (IFP) value;
+ break;
+
+ case SLAPI_PLUGIN_DB_LDIF2DB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_ldif2db = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_DB2LDIF_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_db2ldif = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_DB2INDEX_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_db2index = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_archive2db = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_db2archive = (IFP) value;
+ break;
+#if defined(UPGRADEDB)
+ case SLAPI_PLUGIN_DB_UPGRADEDB_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_upgradedb = (IFP) value;
+ break;
+#endif
+ case SLAPI_PLUGIN_DB_BEGIN_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_begin = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_COMMIT_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_commit = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_ABORT_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_abort = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_SIZE_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_dbsize = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_DB_TEST_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_un.plg_un_db.plg_un_db_dbtest = (IFP) value;
+ break;
+ /* database plugin-specific parameters */
+ case SLAPI_PLUGIN_DB_NO_ACL:
+ if ( pblock->pb_plugin && pblock->pb_plugin->plg_type != SLAPI_PLUGIN_DATABASE ) {
+ return( -1 );
+ }
+ if ( NULL == pblock->pb_backend ) {
+ return( -1 );
+ }
+ pblock->pb_backend->be_noacl = *((int *)value);
+ break;
+
+
+ /* extendedop plugin functions */
+ case SLAPI_PLUGIN_EXT_OP_FN:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_EXTENDEDOP ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_exhandler = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_EXT_OP_OIDLIST:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_EXTENDEDOP ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_exoids = (char **) value;
+ ldapi_register_extended_op( (char **)value );
+ break;
+ case SLAPI_PLUGIN_EXT_OP_NAMELIST:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_EXTENDEDOP ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_exnames = (char **) value;
+ break;
+
+ /* preoperation plugin functions */
+ case SLAPI_PLUGIN_PRE_BIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_prebind = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_UNBIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_preunbind = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_SEARCH_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_presearch = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_COMPARE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_precompare = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_premodify = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_premodrdn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_preadd = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_predelete = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_ABANDON_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_preabandon = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_ENTRY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_preentry = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_REFERRAL_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_prereferral = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_PRE_RESULT_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_preresult = (IFP) value;
+ break;
+
+ /* postoperation plugin functions */
+ case SLAPI_PLUGIN_POST_BIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postbind = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_UNBIND_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postunbind = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_SEARCH_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postsearch = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_SEARCH_FAIL_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postsearchfail = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_COMPARE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postcompare = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postmodify = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postmodrdn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postadd = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postdelete = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_ABANDON_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postabandon = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_ENTRY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postentry = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_REFERRAL_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postreferral = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_POST_RESULT_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_postresult = (IFP) value;
+ break;
+
+ /* backend preoperation plugin */
+ case SLAPI_PLUGIN_BE_PRE_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepremodify = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_BE_PRE_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepremodrdn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_BE_PRE_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepreadd = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_BE_PRE_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepredelete = (IFP) value;
+ break;
+
+ /* backend postoperation plugin */
+ case SLAPI_PLUGIN_BE_POST_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepostmodify = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_BE_POST_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepostmodrdn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_BE_POST_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepostadd = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_BE_POST_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_BEPOSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_bepostdelete = (IFP) value;
+ break;
+
+
+ /* internal preoperation plugin */
+ case SLAPI_PLUGIN_INTERNAL_PRE_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_pre_modify = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_PRE_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_pre_modrdn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_pre_add = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_PRE_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_PREOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_pre_delete = (IFP) value;
+ break;
+
+ /* internal postoperation plugin */
+ case SLAPI_PLUGIN_INTERNAL_POST_MODIFY_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_post_modify = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_POST_MODRDN_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_post_modrdn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_POST_ADD_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_post_add = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_INTERNAL_POST_DELETE_FN:
+ if (pblock->pb_plugin->plg_type != SLAPI_PLUGIN_INTERNAL_POSTOPERATION) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_internal_post_delete = (IFP) value;
+ break;
+
+ /* syntax plugin functions */
+ case SLAPI_PLUGIN_SYNTAX_FILTER_AVA:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_filter_ava = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_FILTER_SUB:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_filter_sub = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_values2keys = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_assertion2keys_ava = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_assertion2keys_sub = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_NAMES:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_names = (char **) value;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_OID:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_oid = (char *) value;
+ break;
+ case SLAPI_PLUGIN_SYNTAX_FLAGS:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_flags = *((int *) value);
+ break;
+ case SLAPI_PLUGIN_SYNTAX_COMPARE:
+ if ( pblock->pb_plugin->plg_type != SLAPI_PLUGIN_SYNTAX ) {
+ return( -1 );
+ }
+ pblock->pb_plugin->plg_syntax_compare = (IFP) value;
+ break;
+ case SLAPI_ENTRY_PRE_OP:
+ pblock->pb_pre_op_entry = (Slapi_Entry *) value;
+ break;
+ case SLAPI_ENTRY_POST_OP:
+ pblock->pb_post_op_entry = (Slapi_Entry *) value;
+ break;
+
+ /* target address for all operations */
+ case SLAPI_TARGET_ADDRESS:
+ PR_ASSERT (PR_FALSE); /* can't do this */
+ break;
+ case SLAPI_TARGET_DN:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.target_address.dn = (char *)value;
+ }
+ break;
+ case SLAPI_ORIGINAL_TARGET_DN:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.target_address.udn = (char *)value;
+ }
+ break;
+ case SLAPI_TARGET_UNIQUEID:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.target_address.uniqueid = (char *) value;
+ }
+ break;
+ case SLAPI_REQCONTROLS:
+ pblock->pb_op->o_params.request_controls = (LDAPControl **) value;
+ break;
+ case SLAPI_RESCONTROLS:
+ pblock->pb_op->o_results.result_controls = (LDAPControl **) value;
+ break;
+ case SLAPI_CONTROLS_ARG: /* used to pass control argument before operation is created */
+ pblock->pb_ctrls_arg = (LDAPControl **) value;
+ break;
+ case SLAPI_ADD_RESCONTROL:
+ add_control( &pblock->pb_op->o_results.result_controls, (LDAPControl *)value );
+ break;
+
+ /* notes to be added to the access log RESULT line for this op. */
+ case SLAPI_OPERATION_NOTES:
+ if ( value == NULL ) {
+ pblock->pb_operation_notes = 0; /* cleared */
+ } else {
+ pblock->pb_operation_notes |= *((unsigned int *)value );
+ }
+ break;
+
+ /* controls we know about */
+ case SLAPI_MANAGEDSAIT:
+ pblock->pb_managedsait = *((int *) value);
+ break;
+ case SLAPI_PWPOLICY:
+ pblock->pb_pwpolicy_ctrl = *((int *) value);
+ break;
+
+ /* add arguments */
+ case SLAPI_ADD_ENTRY:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_add.target_entry = (Slapi_Entry *) value;
+ }
+ break;
+ case SLAPI_ADD_EXISTING_DN_ENTRY:
+ pblock->pb_existing_dn_entry = (Slapi_Entry *) value;
+ break;
+ case SLAPI_ADD_EXISTING_UNIQUEID_ENTRY:
+ pblock->pb_existing_uniqueid_entry = (Slapi_Entry *) value;
+ break;
+ case SLAPI_ADD_PARENT_ENTRY:
+ pblock->pb_parent_entry = (Slapi_Entry *) value;
+ break;
+ case SLAPI_ADD_PARENT_UNIQUEID:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_add.parentuniqueid = (char *) value;
+ }
+ break;
+
+ /* bind arguments */
+ case SLAPI_BIND_METHOD:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_bind.bind_method = *((int *) value);
+ }
+ break;
+ case SLAPI_BIND_CREDENTIALS:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_bind.bind_creds = (struct berval *) value;
+ }
+ break;
+ case SLAPI_BIND_SASLMECHANISM:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_bind.bind_saslmechanism = (char *) value;
+ }
+ break;
+ /* bind return values */
+ case SLAPI_BIND_RET_SASLCREDS:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_bind.bind_ret_saslcreds = (struct berval *) value;
+ }
+ break;
+
+ /* compare arguments */
+ case SLAPI_COMPARE_TYPE:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_compare.compare_ava.ava_type = (char *) value;
+ }
+ break;
+ case SLAPI_COMPARE_VALUE:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_compare.compare_ava.ava_value = *((struct berval *) value);
+ }
+ break;
+
+ /* modify arguments */
+ case SLAPI_MODIFY_MODS:
+ PR_ASSERT(pblock->pb_op);
+ if(pblock->pb_op!=NULL)
+ {
+ if(pblock->pb_op->o_params.operation_type==SLAPI_OPERATION_MODIFY)
+ {
+ pblock->pb_op->o_params.p.p_modify.modify_mods = (LDAPMod **) value;
+ }
+ else if(pblock->pb_op->o_params.operation_type==SLAPI_OPERATION_MODRDN)
+ {
+ pblock->pb_op->o_params.p.p_modrdn.modrdn_mods = (LDAPMod **) value;
+ }
+ else
+ {
+ PR_ASSERT(0);
+ }
+ }
+ break;
+
+ /* modrdn arguments */
+ case SLAPI_MODRDN_NEWRDN:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_modrdn.modrdn_newrdn = (char *) value;
+ }
+ break;
+ case SLAPI_MODRDN_DELOLDRDN:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_modrdn.modrdn_deloldrdn = *((int *) value);
+ }
+ break;
+ case SLAPI_MODRDN_NEWSUPERIOR:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.dn = (char *) value;
+ }
+ break;
+ case SLAPI_MODRDN_PARENT_ENTRY:
+ pblock->pb_parent_entry = (Slapi_Entry *) value;
+ break;
+ case SLAPI_MODRDN_NEWPARENT_ENTRY:
+ pblock->pb_newparent_entry = (Slapi_Entry *) value;
+ break;
+ case SLAPI_MODRDN_TARGET_ENTRY:
+ pblock->pb_target_entry = (Slapi_Entry *) value;
+ break;
+ case SLAPI_MODRDN_NEWSUPERIOR_ADDRESS:
+ PR_ASSERT (PR_FALSE); /* can't do this */
+
+ /* search arguments */
+ case SLAPI_SEARCH_SCOPE:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_scope = *((int *) value);
+ }
+ break;
+ case SLAPI_SEARCH_DEREF:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_deref = *((int *) value);
+ }
+ break;
+ case SLAPI_SEARCH_SIZELIMIT:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_sizelimit = *((int *) value);
+ }
+ break;
+ case SLAPI_SEARCH_TIMELIMIT:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_timelimit = *((int *) value);
+ }
+ break;
+ case SLAPI_SEARCH_FILTER:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_filter = (struct slapi_filter *) value;
+ }
+ break;
+ case SLAPI_SEARCH_STRFILTER:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_strfilter = (char *) value;
+ }
+ break;
+ case SLAPI_SEARCH_ATTRS:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_attrs = (char **) value;
+ }
+ break;
+ case SLAPI_SEARCH_ATTRSONLY:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_attrsonly = *((int *) value);
+ }
+ break;
+ case SLAPI_SEARCH_IS_AND:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_search.search_is_and = *((int *) value);
+ }
+ break;
+
+ /* abandon operation arguments */
+ case SLAPI_ABANDON_MSGID:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_abandon.abandon_targetmsgid = *((int *) value);
+ }
+ break;
+
+ /* extended operation arguments */
+ case SLAPI_EXT_OP_REQ_OID:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_extended.exop_oid = (char *) value;
+ }
+ break;
+ case SLAPI_EXT_OP_REQ_VALUE:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_params.p.p_extended.exop_value = (struct berval *) value;
+ }
+ break;
+ /* extended operation return values */
+ case SLAPI_EXT_OP_RET_OID:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_extended.exop_ret_oid = (char *) value;
+ }
+ break;
+ case SLAPI_EXT_OP_RET_VALUE:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_extended.exop_ret_value = (struct berval *) value;
+ }
+ break;
+
+ /* matching rule plugin functions */
+ case SLAPI_PLUGIN_MR_FILTER_CREATE_FN:
+ SLAPI_PLUGIN_TYPE_CHECK (pblock, SLAPI_PLUGIN_MATCHINGRULE);
+ pblock->pb_plugin->plg_mr_filter_create = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN:
+ SLAPI_PLUGIN_TYPE_CHECK (pblock, SLAPI_PLUGIN_MATCHINGRULE);
+ pblock->pb_plugin->plg_mr_indexer_create = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_MATCH_FN:
+ pblock->pb_mr_filter_match_fn = (mrFilterMatchFn) value;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_INDEX_FN:
+ pblock->pb_mr_filter_index_fn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_RESET_FN:
+ pblock->pb_mr_filter_reset_fn = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_MR_INDEX_FN:
+ pblock->pb_mr_index_fn = (IFP) value;
+ break;
+
+ /* matching rule plugin arguments */
+ case SLAPI_PLUGIN_MR_OID:
+ pblock->pb_mr_oid = (char *) value;
+ break;
+ case SLAPI_PLUGIN_MR_TYPE:
+ pblock->pb_mr_type = (char *) value;
+ break;
+ case SLAPI_PLUGIN_MR_VALUE:
+ pblock->pb_mr_value = (struct berval *) value;
+ break;
+ case SLAPI_PLUGIN_MR_VALUES:
+ pblock->pb_mr_values = (struct berval **) value;
+ break;
+ case SLAPI_PLUGIN_MR_KEYS:
+ pblock->pb_mr_keys = (struct berval **) value;
+ break;
+ case SLAPI_PLUGIN_MR_FILTER_REUSABLE:
+ pblock->pb_mr_filter_reusable = *(unsigned int *) value;
+ break;
+ case SLAPI_PLUGIN_MR_QUERY_OPERATOR:
+ pblock->pb_mr_query_operator = *(int *) value;
+ break;
+ case SLAPI_PLUGIN_MR_USAGE:
+ pblock->pb_mr_usage = *(unsigned int *) value;
+ break;
+
+ /* seq arguments */
+ case SLAPI_SEQ_TYPE:
+ pblock->pb_seq_type = *((int *)value);
+ break;
+ case SLAPI_SEQ_ATTRNAME:
+ pblock->pb_seq_attrname = (char *) value;
+ break;
+ case SLAPI_SEQ_VAL:
+ pblock->pb_seq_val = (char *) value;
+ break;
+
+ /* ldif2db arguments */
+ case SLAPI_LDIF2DB_FILE:
+ pblock->pb_ldif_file = (char *) value;
+ break;
+ case SLAPI_LDIF2DB_REMOVEDUPVALS:
+ pblock->pb_removedupvals = *((int *)value);
+ break;
+ case SLAPI_DB2INDEX_ATTRS:
+ pblock->pb_db2index_attrs = (char **) value;
+ break;
+ case SLAPI_LDIF2DB_NOATTRINDEXES:
+ pblock->pb_ldif2db_noattrindexes = *((int *)value);
+ break;
+ case SLAPI_LDIF2DB_GENERATE_UNIQUEID:
+ pblock->pb_ldif_generate_uniqueid = *((int *)value);
+ break;
+ case SLAPI_LDIF2DB_NAMESPACEID:
+ pblock->pb_ldif_namespaceid = (char *)value;
+ break;
+
+ /* db2ldif arguments */
+ case SLAPI_DB2LDIF_PRINTKEY:
+ pblock->pb_ldif_printkey = *((int *)value);
+ break;
+ case SLAPI_DB2LDIF_DUMP_UNIQUEID:
+ pblock->pb_ldif_dump_uniqueid = *((int *)value);
+ break;
+
+ /* db2ldif/ldif2db/db2bak/bak2db arguments */
+ case SLAPI_BACKEND_INSTANCE_NAME:
+ pblock->pb_instance_name = (char *) value;
+ break;
+ case SLAPI_BACKEND_TASK:
+ pblock->pb_task = (Slapi_Task *)value;
+ break;
+ case SLAPI_TASK_FLAGS:
+ pblock->pb_task_flags = *((int *)value);
+ break;
+ case SLAPI_DB2LDIF_SERVER_RUNNING:
+ pblock->pb_server_running = *((int *)value);
+ break;
+ case SLAPI_BULK_IMPORT_ENTRY:
+ pblock->pb_import_entry = (Slapi_Entry *)value;
+ break;
+ case SLAPI_BULK_IMPORT_STATE:
+ pblock->pb_import_state = *((int *)value);
+ break;
+
+ /* transaction arguments */
+ case SLAPI_PARENT_TXN:
+ pblock->pb_parent_txn = (void *)value;
+ break;
+ case SLAPI_TXN:
+ pblock->pb_txn = (void *)value;
+ break;
+
+ /* Search results set */
+ case SLAPI_SEARCH_RESULT_SET:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_search.search_result_set = (void *)value;
+ }
+ break;
+ /* Search result - entry returned from iterating over result set */
+ case SLAPI_SEARCH_RESULT_ENTRY:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_search.search_result_entry = (void *)value;
+ }
+ break;
+ case SLAPI_SEARCH_RESULT_ENTRY_EXT:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_search.opaque_backend_ptr = (void *)value;
+ }
+ break;
+ /* Number of entries returned from search */
+ case SLAPI_NENTRIES:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_search.nentries = *((int *)value);
+ }
+ break;
+ /* Referrals encountered while iterating over the result set */
+ case SLAPI_SEARCH_REFERRALS:
+ if(pblock->pb_op!=NULL)
+ {
+ pblock->pb_op->o_results.r.r_search.search_referrals = (struct berval **)value;
+ }
+ break;
+
+ case SLAPI_RESULT_CODE:
+ if (pblock->pb_op != NULL)
+ pblock->pb_op->o_results.result_code = (* (int *) value);
+ break;
+ case SLAPI_RESULT_MATCHED:
+ if (pblock->pb_op != NULL)
+ pblock->pb_op->o_results.result_matched = (char *) value;
+ break;
+ case SLAPI_RESULT_TEXT:
+ if (pblock->pb_op != NULL)
+ pblock->pb_op->o_results.result_text = (char *) value;
+ break;
+ case SLAPI_PB_RESULT_TEXT:
+ slapi_ch_free((void**)&(pblock->pb_result_text));
+ pblock->pb_result_text = slapi_ch_strdup ((char *) value);
+ break;
+
+ /* Size of the database, in kb */
+ case SLAPI_DBSIZE:
+ pblock->pb_dbsize = *((unsigned int *)value);
+ break;
+
+ /* ACL Plugin */
+ case SLAPI_PLUGIN_ACL_INIT:
+ pblock->pb_plugin->plg_acl_init = (IFP) value;
+ break;
+
+ case SLAPI_PLUGIN_ACL_SYNTAX_CHECK:
+ pblock->pb_plugin->plg_acl_syntax_check = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_ACL_ALLOW_ACCESS:
+ pblock->pb_plugin->plg_acl_access_allowed = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_ACL_MODS_ALLOWED:
+ pblock->pb_plugin->plg_acl_mods_allowed = (IFP) value;
+ break;
+ case SLAPI_PLUGIN_ACL_MODS_UPDATE:
+ pblock->pb_plugin->plg_acl_mods_update = (IFP) value;
+ break;
+ case SLAPI_CLIENT_DNS:
+ if (pblock->pb_conn == NULL) {
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Connection is NULL and hence cannot access SLAPI_CLIENT_DNS \n", 0, 0, 0 );
+ return (-1);
+ }
+ pblock->pb_conn->c_domain = *((struct berval ***) value );
+ break;
+ /* Command line arguments */
+ case SLAPI_ARGC:
+ pblock->pb_slapd_argc= *((int *)value);
+ break;
+ case SLAPI_ARGV:
+ pblock->pb_slapd_argv = *((char***)value);
+ break;
+
+ /* Config file directory */
+ case SLAPI_CONFIG_DIRECTORY:
+ pblock->pb_slapd_configdir = (char *)value;
+ break;
+
+ /* password storage scheme (kexcoff) */
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_NAME:
+ pblock->pb_plugin->plg_pwdstorageschemename = (char *)value;
+ break;
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_USER_PWD:
+ pblock->pb_pwd_storage_scheme_user_passwd = (char *)value;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DB_PWD:
+ pblock->pb_pwd_storage_scheme_db_passwd = (char *)value;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_ENC_FN:
+ pblock->pb_plugin->plg_pwdstorageschemeenc = (CFP)value;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_DEC_FN:
+ pblock->pb_plugin->plg_pwdstorageschemedec = (IFP)value;
+ break;
+
+ case SLAPI_PLUGIN_PWD_STORAGE_SCHEME_CMP_FN:
+ /* must provide a comparison function */
+ if ( value == NULL )
+ {
+ return(-1);
+ }
+ pblock->pb_plugin->plg_pwdstorageschemecmp = (IFP)value;
+ break;
+
+ /* entry fetch store */
+ case SLAPI_PLUGIN_ENTRY_FETCH_FUNC:
+ pblock->pb_plugin->plg_entryfetchfunc = (IFP) value;
+ break;
+
+ case SLAPI_PLUGIN_ENTRY_STORE_FUNC:
+ pblock->pb_plugin->plg_entrystorefunc = (IFP) value;
+ break;
+
+ /* DSE add parameters */
+ case SLAPI_DSE_DONT_WRITE_WHEN_ADDING:
+ pblock->pb_dse_dont_add_write = *((int *)value);
+ break;
+
+ /* DSE add parameters */
+ case SLAPI_DSE_MERGE_WHEN_ADDING:
+ pblock->pb_dse_add_merge = *((int *)value);
+ break;
+
+ /* DSE add parameters */
+ case SLAPI_DSE_DONT_CHECK_DUPS:
+ pblock->pb_dse_dont_check_dups = *((int *)value);
+ break;
+
+ /* DSE modify parameters */
+ case SLAPI_DSE_REAPPLY_MODS:
+ pblock->pb_dse_reapply_mods = *((int *)value);
+ break;
+
+ /* DSE read parameters */
+ case SLAPI_DSE_IS_PRIMARY_FILE:
+ pblock->pb_dse_is_primary_file = *((int *)value);
+ break;
+
+ /* used internally by schema code only */
+ case SLAPI_SCHEMA_USER_DEFINED_ONLY:
+ pblock->pb_schema_user_defined_only = *((int *)value);
+ break;
+
+ case SLAPI_URP_NAMING_COLLISION_DN:
+ pblock->pb_urp_naming_collision_dn = (char *)value;
+ break;
+
+ case SLAPI_URP_TOMBSTONE_UNIQUEID:
+ pblock->pb_urp_tombstone_uniqueid = (char *)value;
+ break;
+
+ case SLAPI_LDIF2DB_ENCRYPT:
+ case SLAPI_DB2LDIF_DECRYPT:
+ pblock->pb_ldif_encrypt = (int)value;
+ break;
+
+ default:
+ LDAPDebug( LDAP_DEBUG_ANY,
+ "Unknown parameter block argument %d\n", arg, 0, 0 );
+ return( -1 );
+ }
+
+ return( 0 );
+}
+
+
+/*
+ * Clears (and free's as appropriate) the bind DN and related credentials
+ * for the connection `conn'.
+ *
+ * If `lock_conn' is true, 'conn' is locked before touching it; otherwise
+ * this function assumes that conn->c_mutex is ALREADY locked.
+ *
+ * If `clear_externalcreds' is true, the external DN, external authtype,
+ * and client certificate are also cleared and free'd.
+ *
+ * Connection structure members that are potentially changed by this function:
+ * c_dn, c_isroot, c_authtype
+ * c_external_dn, c_external_authtype, c_client_cert
+ *
+ * This function might better belong on bind.c or perhaps connection.c but
+ * it needs to be in libslapd because FE code and libslapd code calls it.
+ */
+void
+bind_credentials_clear( Connection *conn, PRBool lock_conn,
+ PRBool clear_externalcreds )
+{
+ if ( lock_conn ) {
+ PR_Lock( conn->c_mutex );
+ }
+
+ if ( conn->c_dn != NULL ) { /* a non-anonymous bind has occurred */
+ reslimit_update_from_entry( conn, NULL ); /* clear resource limits */
+
+ if ( conn->c_dn != conn->c_external_dn ) {
+ slapi_ch_free((void**)&conn->c_dn);
+ }
+ conn->c_dn = NULL;
+ }
+ slapi_ch_free((void**)&conn->c_authtype);
+ conn->c_isroot = 0;
+ conn->c_authtype = slapi_ch_strdup(SLAPD_AUTH_NONE);
+
+ if ( clear_externalcreds ) {
+ slapi_ch_free( (void**)&conn->c_external_dn );
+ conn->c_external_dn = NULL;
+ conn->c_external_authtype = SLAPD_AUTH_NONE;
+ if ( conn->c_client_cert ) {
+ CERT_DestroyCertificate (conn->c_client_cert);
+ conn->c_client_cert = NULL;
+ }
+ }
+
+ if ( lock_conn ) {
+ PR_Unlock( conn->c_mutex );
+ }
+
+}
+
+
+/*
+ * Clear and then set the bind DN and related credentials for the
+ * connection `conn'.
+ *
+ * `authtype' should be one of the SLAPD_AUTH_... constants defined in
+ * slapu-plugin.h or NULL.
+ *
+ * `normdn' must be a normalized DN and it must be malloc'd memory (it
+ * is consumed by this function). If there is an existing DN value
+ * associated with the connection, it is free'd. Pass NULL for `normdn'
+ * to clear the DN.
+ *
+ * If `extauthtype' is non-NULL we also clear and then set the
+ * external (e.g., SSL) credentials from the `externaldn' and `clientcert'.
+ * Note that it is okay for `externaldn' and 'normdn' to have the same
+ * (pointer) value. This code and that in bind_credentials_clear()
+ * is smart enough to know to only free the memory once. Like `normdn',
+ * `externaldn' and `clientcert' should be NULL or point to malloc'd memory
+ * as they are both consumed by this function.
+ *
+ * We also:
+ *
+ * 1) Test to see if the DN is the root DN and set the c_isroot flag
+ * appropriately.
+ * And
+ *
+ * 2) Call the binder-based resource limits subsystem so it can
+ * update the per-connection resource limit data it maintains.
+ *
+ * Note that this function should ALWAYS be used instead of manipulating
+ * conn->c_dn directly; otherwise, subsystems like the binder-based resource
+ * limits (see resourcelimit.c) won't be called.
+ *
+ * It is also acceptable to set the DN via a call slapi_pblock_set(), e.g.,
+ *
+ * slapi_pblock_set( pb, SLAPI_CONN_DN, ndn );
+ *
+ * because it calls this function.
+ *
+ * Connection structure members that are potentially changed by this function:
+ * c_dn, c_isroot, c_authtype
+ * c_external_dn, c_external_authtype, c_client_cert
+ *
+ * This function might better belong on bind.c or perhaps connection.c but
+ * it needs to be in libslapd because FE code and libslapd code calls it.
+ */
+void
+bind_credentials_set( Connection *conn, char *authtype, char *normdn,
+ char *extauthtype, char *externaldn, CERTCertificate *clientcert, Slapi_Entry * bind_target_entry )
+{
+ PR_Lock( conn->c_mutex );
+
+ /* clear credentials */
+ bind_credentials_clear( conn, PR_FALSE /* conn is already locked */,
+ ( extauthtype != NULL ) /* clear external creds. if requested */ );
+
+ /* set primary credentials */
+ slapi_ch_free((void**)&conn->c_authtype);
+ conn->c_authtype = slapi_ch_strdup(authtype);
+ conn->c_dn = normdn;
+ conn->c_isroot = slapi_dn_isroot( normdn );
+
+
+ /* set external credentials if requested */
+ if ( extauthtype != NULL ) {
+ conn->c_external_authtype = extauthtype;
+ conn->c_external_dn = externaldn;
+ conn->c_client_cert = clientcert;
+ }
+
+
+ /* notify binder-based resource limit subsystem about the change in DN */
+ if ( !conn->c_isroot )
+ {
+ if ( conn->c_dn != NULL ) {
+ if ( bind_target_entry == NULL )
+ {
+ Slapi_DN *sdn;
+
+ sdn = slapi_sdn_new_dn_byref( conn->c_dn ); /* set */
+ reslimit_update_from_dn( conn, sdn );
+ slapi_sdn_free( &sdn );
+ }
+ else
+ reslimit_update_from_entry( conn, bind_target_entry );
+ }
+ }
+
+ PR_Unlock( conn->c_mutex );
+}