]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/slapi_pblock.c
Merge remote branch 'origin/mdb.master'
[openldap] / servers / slapd / slapi / slapi_pblock.c
index 7e5339741911a77708b864df243f71b3a6e8200d..6eb6de5b3fd1d883632af57e59b659ba7937a648 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2002-2005 The OpenLDAP Foundation.
+ * Copyright 2002-2012 The OpenLDAP Foundation.
  * Portions Copyright 1997,2002-2003 IBM Corporation.
  * All rights reserved.
  *
@@ -64,13 +64,14 @@ pblock_get_param_class( int param )
        case SLAPI_DB2LDIF_PRINTKEY:
        case SLAPI_LDIF2DB_REMOVEDUPVALS:
        case SLAPI_MANAGEDSAIT:
-       case SLAPI_X_MANAGEDIT:
+       case SLAPI_X_RELAX:
        case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
        case SLAPI_IS_REPLICATED_OPERATION:
        case SLAPI_X_CONN_IS_UDP:
        case SLAPI_X_CONN_SSF:
        case SLAPI_RESULT_CODE:
        case SLAPI_LOG_OPERATION:
+       case SLAPI_IS_INTERNAL_OPERATION:
                return PBLOCK_CLASS_INTEGER;
                break;
 
@@ -79,6 +80,7 @@ pblock_get_param_class( int param )
        case SLAPI_OPINITIATED_TIME:
        case SLAPI_ABANDON_MSGID:
        case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
+       case SLAPI_OPERATION_MSGID:
                return PBLOCK_CLASS_LONG_INTEGER;
                break;
 
@@ -166,6 +168,16 @@ pblock_get_param_class( int param )
        case SLAPI_X_PLUGIN_PRE_GROUP_FN:
        case SLAPI_X_PLUGIN_POST_GROUP_FN:
        case SLAPI_PLUGIN_AUDIT_FN:
+       case SLAPI_PLUGIN_INTERNAL_PRE_BIND_FN:
+       case SLAPI_PLUGIN_INTERNAL_PRE_UNBIND_FN:
+       case SLAPI_PLUGIN_INTERNAL_PRE_SEARCH_FN:
+       case SLAPI_PLUGIN_INTERNAL_PRE_COMPARE_FN:
+       case SLAPI_PLUGIN_INTERNAL_PRE_ABANDON_FN:
+       case SLAPI_PLUGIN_INTERNAL_POST_BIND_FN:
+       case SLAPI_PLUGIN_INTERNAL_POST_UNBIND_FN:
+       case SLAPI_PLUGIN_INTERNAL_POST_SEARCH_FN:
+       case SLAPI_PLUGIN_INTERNAL_POST_COMPARE_FN:
+       case SLAPI_PLUGIN_INTERNAL_POST_ABANDON_FN:
                return PBLOCK_CLASS_FUNCTION_POINTER;
                break;
 
@@ -277,6 +289,7 @@ pblock_get_param_class( int param )
        case SLAPI_X_GROUP_ATTRIBUTE:
        case SLAPI_X_GROUP_OPERATION_DN:
        case SLAPI_X_GROUP_TARGET_ENTRY:
+       case SLAPI_X_ADD_STRUCTURAL_CLASS:
        case SLAPI_PLUGIN_AUDIT_DATA:
        case SLAPI_IBM_PBLOCK:
        case SLAPI_PLUGIN_VERSION:
@@ -292,13 +305,13 @@ pblock_get_param_class( int param )
 static void
 pblock_lock( Slapi_PBlock *pb )
 {
-       ldap_pvt_thread_mutex_lock(&pb->pb_mutex);
+       ldap_pvt_thread_mutex_lock( &pb->pb_mutex );
 }
 
 static void
 pblock_unlock( Slapi_PBlock *pb )
 {
-       ldap_pvt_thread_mutex_unlock(&pb->pb_mutex);
+       ldap_pvt_thread_mutex_unlock( &pb->pb_mutex );
 }
 
 static int 
@@ -383,7 +396,7 @@ static int
 pblock_set_default( Slapi_PBlock *pb, int param, void *value ) 
 {
        slapi_pblock_class_t pbClass;
-       size_t i;
+       int i;
 
        pbClass = pblock_get_param_class( param );
        if ( pbClass == PBLOCK_CLASS_INVALID ) {
@@ -434,7 +447,7 @@ pblock_be_call( Slapi_PBlock *pb, int (*bep)(Operation *) )
        op = pb->pb_op;
 
        be_orig = op->o_bd;
-       op->o_bd = select_backend( &op->o_req_ndn, 0, 0 );
+       op->o_bd = select_backend( &op->o_req_ndn, 0 );
        rc = (*bep)( op );
        op->o_bd = be_orig;
 
@@ -464,14 +477,37 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                PBLOCK_ASSERT_OP( pb, 0 );
                *((ber_tag_t *)value) = pb->pb_op->o_tag;
                break;
+       case SLAPI_OPERATION_MSGID:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((long *)value) = pb->pb_op->o_msgid;
+               break;
        case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
                PBLOCK_ASSERT_OP( pb, 0 );
-               *((ber_tag_t *)value) = pb->pb_op->o_delete_glue_parent;
+               *((int *)value) = pb->pb_op->o_delete_glue_parent;
                break;
        case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
                PBLOCK_ASSERT_OP( pb, 0 );
                *((int *)value) = get_no_schema_check( pb->pb_op );
                break;
+       case SLAPI_X_ADD_STRUCTURAL_CLASS:
+               PBLOCK_ASSERT_OP( pb, 0 );
+
+               if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
+                       struct berval tmpval = BER_BVNULL;
+
+                       rc = mods_structural_class( pb->pb_op->ora_modlist,
+                               &tmpval, &pb->pb_rs->sr_text,
+                               pb->pb_textbuf, sizeof( pb->pb_textbuf ),
+                               pb->pb_op->o_tmpmemctx );
+                       *((char **)value) = tmpval.bv_val;
+               } else {
+                       rc = PBLOCK_ERROR;
+               }
+               break;
+       case SLAPI_X_OPERATION_NO_SUBORDINATE_GLUE:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((int *)value) = pb->pb_op->o_no_subordinate_glue;
+               break;
        case SLAPI_REQCONTROLS:
                PBLOCK_ASSERT_OP( pb, 0 );
                *((LDAPControl ***)value) = pb->pb_op->o_ctrls;
@@ -484,13 +520,13 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                PBLOCK_ASSERT_OP( pb, 0 );
                *((int *)value) = get_manageDSAit( pb->pb_op );
                break;
-       case SLAPI_X_MANAGEDIT:
+       case SLAPI_X_RELAX:
                PBLOCK_ASSERT_OP( pb, 0 );
-               *((int *)value) = get_manageDIT( pb->pb_op );
+               *((int *)value) = get_relax( pb->pb_op );
                break;
        case SLAPI_BACKEND:
                PBLOCK_ASSERT_OP( pb, 0 );
-               *((BackendDB **)value) = pb->pb_op->o_bd;
+               *((BackendDB **)value) = select_backend( &pb->pb_op->o_req_ndn, 0 );
                break;
        case SLAPI_BE_TYPE:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -534,6 +570,9 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
 #endif
                                                         );
                break;
+       case SLAPI_IS_INTERNAL_OPERATION:
+               *((int *)value) = pb->pb_intop;
+               break;
        case SLAPI_X_CONN_IS_UDP:
                PBLOCK_ASSERT_CONN( pb );
 #ifdef LDAP_CONNECTIONLESS
@@ -548,6 +587,12 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                break;
        case SLAPI_CONN_DN:
                PBLOCK_ASSERT_CONN( pb );
+#if 0
+               /* This would be necessary to keep plugin compat after the fix in ITS#4158 */
+               if ( pb->pb_op->o_tag == LDAP_REQ_BIND && pb->pb_rs->sr_err == LDAP_SUCCESS )
+                       *((char **)value) = pb->pb_op->orb_edn.bv_val;
+               else
+#endif
                *((char **)value) = pb->pb_conn->c_dn.bv_val;
                break;
        case SLAPI_CONN_CLIENTIP:
@@ -566,14 +611,14 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                break;
        case SLAPI_CONN_SERVERIP:
                PBLOCK_ASSERT_CONN( pb );
-               if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "IP=", 3 ) == 0 )
+               if ( strncmp( pb->pb_conn->c_sock_name.bv_val, "IP=", 3 ) == 0 )
                        *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[3];
                else
                        *value = NULL;
                break;
        case SLAPI_X_CONN_SERVERPATH:
                PBLOCK_ASSERT_CONN( pb );
-               if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "PATH=", 3 ) == 0 )
+               if ( strncmp( pb->pb_conn->c_sock_name.bv_val, "PATH=", 3 ) == 0 )
                        *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[5];
                else
                        *value = NULL;
@@ -600,15 +645,25 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                break;
        case SLAPI_MODIFY_MODS: {
                LDAPMod **mods = NULL;
+               Modifications *ml = NULL;
 
                pblock_get_default( pb, param, (void **)&mods );
                if ( mods == NULL && pb->pb_intop == 0 ) {
-                       if ( pb->pb_op->o_tag != LDAP_REQ_MODIFY ) {
+                       switch ( pb->pb_op->o_tag ) {
+                       case LDAP_REQ_MODIFY:
+                               ml = pb->pb_op->orm_modlist;
+                               break;
+                       case LDAP_REQ_MODRDN:
+                               ml = pb->pb_op->orr_modlist;
+                               break;
+                       default:
                                rc = PBLOCK_ERROR;
                                break;
                        }
-                       mods = slapi_int_modifications2ldapmods( &pb->pb_op->orm_modlist );
-                       pblock_set_default( pb, param, (void *)mods );
+                       if ( rc != PBLOCK_ERROR ) {
+                               mods = slapi_int_modifications2ldapmods( ml );
+                               pblock_set_default( pb, param, (void *)mods );
+                       }
                }
                *((LDAPMod ***)value) = mods;
                break;
@@ -827,6 +882,10 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_tag = *((ber_tag_t *)value);
                break;
+       case SLAPI_OPERATION_MSGID:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_op->o_msgid = *((long *)value);
+               break;
        case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_delete_glue_parent = *((int *)value);
@@ -835,6 +894,10 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_no_schema_check = *((int *)value);
                break;
+       case SLAPI_X_OPERATION_NO_SUBORDINATE_GLUE:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_op->o_no_subordinate_glue = *((int *)value);
+               break;
        case SLAPI_REQCONTROLS:
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_ctrls = (LDAPControl **)value;
@@ -862,9 +925,9 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_managedsait = *((int *)value);
                break;
-       case SLAPI_X_MANAGEDIT:
+       case SLAPI_X_RELAX:
                PBLOCK_ASSERT_OP( pb, 0 );
-               pb->pb_op->o_managedit = *((int *)value);
+               pb->pb_op->o_relax = *((int *)value);
                break;
        case SLAPI_BACKEND:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -876,7 +939,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
        case SLAPI_X_CONN_SSF:
                PBLOCK_ASSERT_CONN( pb );
                PBLOCK_LOCK_CONN( pb );
-               pb->pb_conn->c_ssf = (slap_ssf_t)value;
+               pb->pb_conn->c_ssf = (slap_ssf_t)(long)value;
                PBLOCK_UNLOCK_CONN( pb );
                break;
        case SLAPI_X_CONN_SASL_CONTEXT:
@@ -936,11 +999,13 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                        mlp = &pb->pb_op->orm_modlist;
                } else if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
                        mlp = &pb->pb_op->ora_modlist;
+               } else if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
+                       mlp = &pb->pb_op->orr_modlist;
                } else {
                        break;
                }
 
-               newmods = slapi_int_ldapmods2modifications( (LDAPMod **)value );
+               newmods = slapi_int_ldapmods2modifications( pb->pb_op, (LDAPMod **)value );
                if ( newmods != NULL ) {
                        slap_mods_free( *mlp, 1 );
                        *mlp = newmods;
@@ -1007,9 +1072,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                        case LDAP_SCOPE_BASE:
                        case LDAP_SCOPE_ONELEVEL:
                        case LDAP_SCOPE_SUBTREE:
-#ifdef LDAP_SCOPE_SUBORDINATE
                        case LDAP_SCOPE_SUBORDINATE:
-#endif
                                pb->pb_op->ors_scope = scope;
                                break;
                        default:
@@ -1060,7 +1123,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                break;
        case SLAPI_SEARCH_ATTRS: {
                AttributeName *an = NULL;
-               size_t i = 0;
+               size_t i = 0, j = 0;
                char **attrs = (char **)value;
 
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -1084,18 +1147,20 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                                ;
                }
                if ( i ) {
-                       an = (AttributeName *)pb->pb_op->o_tmpalloc( (i + 1) *
+                       an = (AttributeName *)pb->pb_op->o_tmpcalloc( i + 1,
                                sizeof(AttributeName), pb->pb_op->o_tmpmemctx );
                        for ( i = 0; attrs[i] != NULL; i++ ) {
-                               an[i].an_desc = NULL;
-                               an[i].an_oc = NULL;
-                               an[i].an_oc_exclude = 0;
-                               an[i].an_name.bv_val = attrs[i];
-                               an[i].an_name.bv_len = strlen( attrs[i] );
-                               slap_bv2ad( &an[i].an_name, &an[i].an_desc, &pb->pb_rs->sr_text );
+                               an[j].an_desc = NULL;
+                               an[j].an_oc = NULL;
+                               an[j].an_flags = 0;
+                               an[j].an_name.bv_val = attrs[i];
+                               an[j].an_name.bv_len = strlen( attrs[i] );
+                               if ( slap_bv2ad( &an[j].an_name, &an[j].an_desc, &pb->pb_rs->sr_text ) == LDAP_SUCCESS ) {
+                                       j++;
+                               }
                        }
-                       an[i].an_name.bv_val = NULL;
-                       an[i].an_name.bv_len = 0;
+                       an[j].an_name.bv_val = NULL;
+                       an[j].an_name.bv_len = 0;
                }       
                pb->pb_op->ors_attrs = an;
                break;
@@ -1111,7 +1176,9 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                break;
        case SLAPI_SEARCH_RESULT_ENTRY:
                PBLOCK_ASSERT_OP( pb, 0 );
-               pb->pb_rs->sr_entry = (Slapi_Entry *)value;
+               rs_replace_entry( pb->pb_op, pb->pb_rs, NULL, (Slapi_Entry *)value );
+               /* TODO: Should REP_ENTRY_MODIFIABLE be set? */
+               pb->pb_rs->sr_flags |= REP_ENTRY_MUSTBEFREED;
                break;
        case SLAPI_BIND_RET_SASLCREDS:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -1198,11 +1265,13 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
        case SLAPI_IS_REPLICATED_OPERATION:
        case SLAPI_CONN_AUTHTYPE:
        case SLAPI_CONN_AUTHMETHOD:
+       case SLAPI_IS_INTERNAL_OPERATION:
        case SLAPI_X_CONN_IS_UDP:
        case SLAPI_CONN_CLIENTIP:
        case SLAPI_X_CONN_CLIENTPATH:
        case SLAPI_CONN_SERVERIP:
        case SLAPI_X_CONN_SERVERPATH:
+       case SLAPI_X_ADD_STRUCTURAL_CLASS:
                /* These parameters cannot be set */
                rc = PBLOCK_ERROR;
                break;
@@ -1355,4 +1424,3 @@ slapi_int_pblock_get_next( Slapi_PBlock **pb )
 }
 
 #endif /* LDAP_SLAPI */
-