]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
When recreating a database from an ldif file created by ldbmcat,
[openldap] / servers / slapd / controls.c
index 1afb52038a8f6c6092693063ab1a87b7117d1e5d..b4d76d73fb1f6c13d4d262bf0607a42a8093bc96 100644 (file)
@@ -17,6 +17,7 @@
 #include "../../libraries/liblber/lber-int.h"
 
 char *supportedControls[] = {
+       LDAP_CONTROL_MANAGEDSAIT,
        NULL
 };
 
@@ -25,7 +26,7 @@ int get_ctrls(
        Operation *op,
        int sendres )
 {
-       int nctrls;
+       int nctrls = 0;
        ber_tag_t tag;
        ber_len_t len;
        char *opaque;
@@ -39,7 +40,7 @@ int get_ctrls(
        if( len == 0) {
                /* no controls */
                rc = LDAP_SUCCESS;
-               goto return_results;
+               return rc;
        }
 
        if(( tag = ber_peek_tag( ber, &len )) != LDAP_TAG_CONTROLS ) {
@@ -51,6 +52,8 @@ int get_ctrls(
                goto return_results;
        }
 
+       Debug( LDAP_DEBUG_TRACE, "=> get_ctrls\n", 0, 0, 0 );
+
        if( op->o_protocol < LDAP_VERSION3 ) {
                rc = -1;
                errmsg = "controls require LDAPv3";
@@ -58,7 +61,6 @@ int get_ctrls(
        }
 
        /* set through each element */
-       nctrls = 0;
        *ctrls = ch_malloc( 1 * sizeof(LDAPControl *) );
 
 #if 0
@@ -79,6 +81,8 @@ int get_ctrls(
                LDAPControl **tctrls;
 
                tctrl = ch_calloc( 1, sizeof(LDAPControl) );
+               tctrl->ldctl_oid = NULL;
+               tctrl->ldctl_value.bv_val = NULL;
 
                /* allocate pointer space for current controls (nctrls)
                 * + this control + extra NULL
@@ -103,39 +107,58 @@ int get_ctrls(
                }
 #endif
 
-
                tctrls[nctrls++] = tctrl;
                tctrls[nctrls] = NULL;
 
                tag = ber_scanf( ber, "{a" /*}*/, &tctrl->ldctl_oid );
 
-               if( tag != LBER_ERROR ) {
-                       tag = ber_peek_tag( ber, &len );
+               if( tag == LBER_ERROR ) {
+                       Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: get oid failed.\n",
+                               0, 0, 0 );
+                       *ctrls = NULL;
+                       ldap_controls_free( tctrls );
+                       rc = -1;
+                       errmsg = "decoding controls error";
+                       goto return_results;
                }
 
+               tag = ber_peek_tag( ber, &len );
+
                if( tag == LBER_BOOLEAN ) {
                        ber_int_t crit;
                        tag = ber_scanf( ber, "b", &crit );
-                       tctrl->ldctl_iscritical = crit ? (char) 0 : (char) ~0;
-               }
 
-               if( tag != LBER_ERROR ) {
+                       if( tag == LBER_ERROR ) {
+                               Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: get crit failed.\n",
+                                       0, 0, 0 );
+                               *ctrls = NULL;
+                               ldap_controls_free( tctrls );
+                               rc = -1;
+                               errmsg = "decoding controls error";
+                               goto return_results;
+                       }
+
+                       tctrl->ldctl_iscritical = (crit != 0);
                        tag = ber_peek_tag( ber, &len );
                }
 
+               Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: oid=\"%s\" (%scritical)\n",
+                       tctrl->ldctl_oid, 
+                       tctrl->ldctl_iscritical ? "" : "non",
+                       0 );
+
                if( tag == LBER_OCTETSTRING ) {
                        tag = ber_scanf( ber, "o", &tctrl->ldctl_value );
 
-               } else {
-                       tctrl->ldctl_value.bv_val = NULL;
-               }
-
-               if( tag == LBER_ERROR ) {
-                       *ctrls = NULL;
-                       ldap_controls_free( tctrls );
-                       rc = -1;
-                       errmsg = "decoding controls error";
-                       goto return_results;
+                       if( tag == LBER_ERROR ) {
+                               Debug( LDAP_DEBUG_TRACE, "=> get_ctrls: get value failed.\n",
+                                       0, 0, 0 );
+                               *ctrls = NULL;
+                               ldap_controls_free( tctrls );
+                               rc = -1;
+                               errmsg = "decoding controls error";
+                               goto return_results;
+                       }
                }
 
                if( tctrl->ldctl_iscritical &&
@@ -150,13 +173,36 @@ int get_ctrls(
        }
 
 return_results:
+       Debug( LDAP_DEBUG_TRACE, "<= get_ctrls: %d %d %s\n",
+               nctrls, rc, errmsg ? errmsg : "");
+
        if( sendres && rc != LDAP_SUCCESS ) {
                if( rc == -1 ) {
                        send_ldap_disconnect( conn, op, rc, errmsg );
                } else {
-                       send_ldap_result( conn, op, rc, NULL, errmsg );
+                       send_ldap_result( conn, op, rc,
+                               NULL, errmsg, NULL, NULL );
                }
        }
 
        return rc;
 }
+
+
+int get_manageDSAit( Operation *op )
+{
+       int i;
+       if( op == NULL || op->o_ctrls == NULL ) {
+               return 0;
+       }
+
+       for( i=0; op->o_ctrls[i] != NULL; i++ ) {
+               if( strcmp( LDAP_CONTROL_MANAGEDSAIT, op->o_ctrls[i]->ldctl_oid )
+                       == 0 )
+               {
+                       return 1;
+               }
+       }
+
+       return 0;
+}