]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/limits.c
Modify ad_cmp() macro to support use as an ordering function.
[openldap] / servers / slapd / limits.c
index dc614779a51328792a249f2899d9f3db1244a7d5..2cddf4166b969d7e337e16ea521b56a2fed63345 100644 (file)
@@ -1,6 +1,6 @@
 /* limits.c - routines to handle regex-based size and time limits */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -16,7 +16,7 @@
 int
 get_limits( 
        Backend                 *be, 
-       const char              *ndn, 
+       struct berval           *ndn, 
        struct slap_limits_set  **limit
 )
 {
@@ -37,10 +37,10 @@ get_limits(
        for ( lm = be->be_limits; lm[0] != NULL; lm++ ) {
                switch ( lm[0]->lm_type ) {
                case SLAP_LIMITS_EXACT:
-                       if ( ndn == NULL || ndn[0] == '\0' ) {
+                       if ( ndn->bv_len == 0 ) {
                                break;
                        }
-                       if ( strcmp( lm[0]->lm_dn_pat->bv_val, ndn ) == 0 ) {
+                       if ( dn_match( &lm[0]->lm_dn_pat, ndn ) ) {
                                *limit = &lm[0]->lm_limits;
                                return( 0 );
                        }
@@ -51,11 +51,11 @@ get_limits(
                case SLAP_LIMITS_CHILDREN: {
                        size_t d;
                        
-                       if ( ndn == NULL || ndn[0] == '\0' ) {
+                       if ( ndn->bv_len == 0 ) {
                                break;
                        }
 
-                       d = strlen( ndn ) - lm[0]->lm_dn_pat->bv_len;
+                       d = ndn->bv_len - lm[0]->lm_dn_pat.bv_len;
                        /* ndn shorter than dn_pat */
                        if ( d < 0 ) {
                                break;
@@ -68,13 +68,16 @@ get_limits(
                                }
                        } else {
                                /* check for unescaped rdn separator */
-                               if ( !DN_SEPARATOR( ndn[d-1] ) || DN_ESCAPE( ndn[d-2] ) ) {
+                               if ( !DN_SEPARATOR( ndn->bv_val[d-1] )
+                                       || DN_ESCAPE( ndn->bv_val[d-2] ) )
+                               {
                                        break;
                                }
                        }
 
                        /* in case of (sub)match ... */
-                       if ( strcmp( lm[0]->lm_dn_pat->bv_val, &ndn[d] ) == 0 ) {
+                       if ( lm[0]->lm_dn_pat.bv_len == ( ndn->bv_len - d )
+                                       && strcmp( lm[0]->lm_dn_pat.bv_val, &ndn->bv_val[d] ) == 0 ) {
                                /* check for exactly one rdn in case of ONE */
                                if ( lm[0]->lm_type == SLAP_LIMITS_ONE ) {
                                        /*
@@ -94,24 +97,26 @@ get_limits(
                }
 
                case SLAP_LIMITS_REGEX:
-                       if ( ndn == NULL || ndn[0] == '\0' ) {
+                       if ( ndn->bv_len == 0 ) {
                                break;
                        }
-                       if ( regexec( &lm[0]->lm_dn_regex, ndn, 0, NULL, 0 ) == 0 ) {
+                       if ( regexec( &lm[0]->lm_dn_regex, ndn->bv_val, 0, NULL, 0 )
+                               == 0 )
+                       {
                                *limit = &lm[0]->lm_limits;
                                return( 0 );
                        }
                        break;
 
                case SLAP_LIMITS_ANONYMOUS:
-                       if ( ndn == NULL || ndn[0] == '\0' ) {
+                       if ( ndn->bv_len == 0 ) {
                                *limit = &lm[0]->lm_limits;
                                return( 0 );
                        }
                        break;
 
                case SLAP_LIMITS_USERS:
-                       if ( ndn != NULL && ndn[0] != '\0' ) {
+                       if ( ndn->bv_len != 0 ) {
                                *limit = &lm[0]->lm_limits;
                                return( 0 );
                        }
@@ -126,7 +131,7 @@ get_limits(
        return( 0 );
 }
 
-int
+static int
 add_limits(
        Backend                 *be,
        int                     type,
@@ -148,21 +153,27 @@ add_limits(
        case SLAP_LIMITS_SUBTREE:
        case SLAP_LIMITS_CHILDREN:
                lm->lm_type = type;
-               lm->lm_dn_pat = ber_bvstrdup( pattern );
-               if ( dn_normalize( lm->lm_dn_pat->bv_val ) == NULL ) {
-                       ber_bvfree( lm->lm_dn_pat );
-                       ch_free( lm );
-                       return( -1 );
+               {
+                       int rc;
+                       struct berval bv;
+                       bv.bv_val = (char *) pattern;
+                       bv.bv_len = strlen( pattern );
+
+                       rc = dnNormalize2( NULL, &bv, &lm->lm_dn_pat );
+                       if ( rc != LDAP_SUCCESS ) {
+                               ch_free( lm );
+                               return( -1 );
+                       }
                }
                break;
                
        case SLAP_LIMITS_REGEX:
        case SLAP_LIMITS_UNDEFINED:
                lm->lm_type = SLAP_LIMITS_REGEX;
-               lm->lm_dn_pat = ber_bvstrdup( pattern );
-               if ( regcomp( &lm->lm_dn_regex, lm->lm_dn_pat->bv_val, 
+               ber_str2bv( pattern, 0, 1, &lm->lm_dn_pat );
+               if ( regcomp( &lm->lm_dn_regex, lm->lm_dn_pat.bv_val, 
                                        REG_EXTENDED | REG_ICASE ) ) {
-                       ber_bvfree( lm->lm_dn_pat );
+                       free( lm->lm_dn_pat.bv_val );
                        ch_free( lm );
                        return( -1 );
                }
@@ -171,7 +182,8 @@ add_limits(
        case SLAP_LIMITS_ANONYMOUS:
        case SLAP_LIMITS_USERS:
                lm->lm_type = type;
-               lm->lm_dn_pat = NULL;
+               lm->lm_dn_pat.bv_val = NULL;
+               lm->lm_dn_pat.bv_len = 0;
                break;
        }