]> git.sur5r.net Git - openldap/commitdiff
use direct access instead of string comparison to check supported controls
authorPierangelo Masarati <ando@openldap.org>
Sat, 29 Jan 2005 17:58:48 +0000 (17:58 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sat, 29 Jan 2005 17:58:48 +0000 (17:58 +0000)
servers/slapd/back-relay/init.c
servers/slapd/backend.c
servers/slapd/backover.c
servers/slapd/frontend.c
servers/slapd/slap.h

index d5a3d9ac15a5d4abacad01c05896079954e688ba..d3b19e6d496d8fafb53b88c47a697f9a1d745e6e 100644 (file)
@@ -21,6 +21,7 @@
 #include "portable.h"
 
 #include <stdio.h>
+#include <ac/string.h>
 
 #include "slap.h"
 #include "back-relay.h"
@@ -102,15 +103,11 @@ relay_back_db_open( Backend *be )
                assert( ri->ri_bd );
 
                /* inherit controls */
-               if ( ri->ri_bd->be_controls ) {
-                       be->be_controls = ldap_charray_dup( ri->ri_bd->be_controls );
-               }
+               AC_MEMCPY( be->be_ctrls, ri->ri_bd->be_ctrls, sizeof( be->be_ctrls ) );
 
        } else {
                /* inherit all? */
-               if ( frontendDB->be_controls ) {
-                       be->be_controls = ldap_charray_dup( frontendDB->be_controls );
-               }
+               AC_MEMCPY( be->be_ctrls, frontendDB->be_ctrls, sizeof( be->be_ctrls ) );
        }
 
        return 0;
index 084a82568855d6c7b41a0eec3bbe0e25aa20358b..8de9c895e24b50ca6ed2449a0b2124c5bb3e6bd0 100644 (file)
@@ -65,6 +65,32 @@ BackendDB            *backendDB = NULL;
 ldap_pvt_thread_pool_t syncrepl_pool;
 int                    syncrepl_pool_max = SLAP_MAX_SYNCREPL_THREADS;
 
+static int
+backend_init_controls( BackendInfo *bi )
+{
+       if ( bi->bi_controls ) {
+               int     i;
+
+               for ( i = 0; bi->bi_controls[ i ]; i++ ) {
+                       int     cid;
+
+                       if ( slap_find_control_id( bi->bi_controls[ i ], &cid )
+                                       == LDAP_CONTROL_NOT_FOUND )
+                       {
+                               if ( !( slapMode & SLAP_TOOL_MODE ) ) {
+                                       assert( 0 );
+                               }
+
+                               return -1;
+                       }
+
+                       bi->bi_ctrls[ cid ] = 1;
+               }
+       }
+
+       return 0;
+}
+
 int backend_init(void)
 {
        int rc = -1;
@@ -132,12 +158,15 @@ int backend_add(BackendInfo *aBackendInfo)
                return -1;
        }
 
-   if ((rc = aBackendInfo->bi_init(aBackendInfo)) != 0) {
+       rc = aBackendInfo->bi_init(aBackendInfo);
+       if ( rc != 0) {
                Debug( LDAP_DEBUG_ANY,
                        "backend_add:  initialization for type \"%s\" failed\n",
                        aBackendInfo->bi_type, 0, 0 );
                return rc;
-   }
+       }
+
+       (void)backend_init_controls( aBackendInfo );
 
        /* now add the backend type to the Backend Info List */
        {
@@ -175,25 +204,27 @@ int backend_startup_one(Backend *be)
        LDAP_TAILQ_INIT( be->be_pending_csn_list );
 
        /* back-relay takes care of itself; so may do other */
-       if ( be->be_controls == NULL ) {
+       if ( be->be_ctrls[ SLAP_MAX_CIDS ] == 0 ) {
                if ( overlay_is_over( be ) ) {
                        bi = ((slap_overinfo *)be->bd_info->bi_private)->oi_orig;
                }
 
                if ( bi->bi_controls ) {
-                       be->be_controls = ldap_charray_dup( bi->bi_controls );
+                       AC_MEMCPY( be->be_ctrls, bi->bi_ctrls, sizeof( be->be_ctrls ) );
                }
+
+               be->be_ctrls[ SLAP_MAX_CIDS ] = 1;
        }
 
        Debug( LDAP_DEBUG_TRACE,
-               "backend_startup: starting \"%s\"\n",
+               "backend_startup_one: starting \"%s\"\n",
                be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)",
                0, 0 );
        if ( be->bd_info->bi_db_open ) {
                rc = be->bd_info->bi_db_open( be );
                if ( rc != 0 ) {
                        Debug( LDAP_DEBUG_ANY,
-                               "backend_startup: bi_db_open failed! (%d)\n",
+                               "backend_startup_one: bi_db_open failed! (%d)\n",
                                rc, 0, 0 );
                }
        }
@@ -205,19 +236,16 @@ int backend_startup_one(Backend *be)
        }
 
        if ( bi->bi_controls ) {
-               if ( be->be_controls == NULL ) {
-                       be->be_controls = ldap_charray_dup( bi->bi_controls );
+               if ( be->be_ctrls[ SLAP_MAX_CIDS ] == 0 ) {
+                       AC_MEMCPY( be->be_ctrls, bi->bi_ctrls, sizeof( be->be_ctrls ) );
+                       be->be_ctrls[ SLAP_MAX_CIDS ] = 1;
 
                } else {
                        int     i;
 
-                       /* maybe not efficient, but it's startup and few dozens of controls... */
-                       for ( i = 0; bi->bi_controls[ i ]; i++ ) {
-                               if ( !ldap_charray_inlist( be->be_controls, bi->bi_controls[ i ] ) ) {
-                                       rc = ldap_charray_add( &be->be_controls, bi->bi_controls[ i ] );
-                                       if ( rc != 0 ) {
-                                               break;
-                                       }
+                       for ( i = 0; i < SLAP_MAX_CIDS; i++ ) {
+                               if ( bi->bi_ctrls[ i ] ) {
+                                       be->be_ctrls[ i ] = 1;
                                }
                        }
                }
@@ -273,8 +301,7 @@ int backend_startup(Backend *be)
                }
 
                if( backendInfo[i].bi_open ) {
-                       rc = backendInfo[i].bi_open(
-                               &backendInfo[i] );
+                       rc = backendInfo[i].bi_open( &backendInfo[i] );
                        if ( rc != 0 ) {
                                Debug( LDAP_DEBUG_ANY,
                                        "backend_startup: bi_open %d failed!\n",
@@ -282,6 +309,8 @@ int backend_startup(Backend *be)
                                return rc;
                        }
                }
+
+               (void)backend_init_controls( &backendInfo[i] );
        }
 
        ldap_pvt_thread_mutex_init( &slapd_rq.rq_mutex );
@@ -448,9 +477,6 @@ int backend_destroy(void)
                        free( bd->be_rootpw.bv_val );
                }
                acl_destroy( bd->be_acl, frontendDB->be_acl );
-               if ( bd->be_controls ) {
-                       ldap_charray_free( bd->be_controls );
-               }
        }
        free( backendDB );
 
@@ -860,8 +886,7 @@ backend_check_controls(
                                }
 
                        } else if ( !slap_global_control( op, (*ctrls)->ldctl_oid ) &&
-                               !ldap_charray_inlist( op->o_bd->be_controls,
-                                       (*ctrls)->ldctl_oid ) )
+                               !op->o_bd->be_ctrls[ cid ] )
                        {
                                /* Per RFC 2251 (and LDAPBIS discussions), if the control
                                 * is recognized and appropriate for the operation (which
index 4f0082b0d6cebf23ccdbfa8b06d782977cf44375..0ab6beb4ca7691bd754494eaefb04c0ce55ba74d 100644 (file)
@@ -472,6 +472,11 @@ overlay_register_control( BackendDB *be, const char *oid )
 {
        int             rc = 0;
        int             gotit = 0;
+       int             cid;
+
+       if ( slap_find_control_id( oid, &cid ) == LDAP_CONTROL_NOT_FOUND ) {
+               return -1;
+       }
 
        if ( SLAP_DBFLAGS( be ) & SLAP_DBFLAG_GLOBAL_OVERLAY ) {
                int     i;
@@ -484,23 +489,13 @@ overlay_register_control( BackendDB *be, const char *oid )
                                gotit = 1;
                        }
 
-                       if ( bd->be_controls == NULL ||
-                               !ldap_charray_inlist( bd->be_controls, oid ) )
-                       {
-                               rc = ldap_charray_add( &bd->be_controls, oid );
-                               if ( rc ) {
-                                       break;
-                               }
-                       }
+                       bd->be_ctrls[ cid ] = 1;
                }
 
        }
        
-       if ( rc == 0 && !gotit && !ldap_charray_inlist( be->be_controls, oid ) ) {
-               rc = ldap_charray_add( &be->be_controls, oid );
-               if ( rc ) {
-                       return rc;
-               }
+       if ( rc == 0 && !gotit ) {
+               be->be_ctrls[ cid ] = 1;
        }
 
        return rc;
index bf9635b8755a659ef468f279e7d15a0f71b24d08..f9cfe6f466137c0110dc178e324dc7c27704b8ae 100644 (file)
@@ -86,8 +86,25 @@ frontend_init( void )
        frontendDB->bd_info->bi_type = "frontend";
 
        /* known controls */
-       frontendDB->bd_info->bi_controls = slap_known_controls;
-       frontendDB->be_controls = ldap_charray_dup( slap_known_controls );
+       if ( slap_known_controls ) {
+               int     i;
+
+               frontendDB->bd_info->bi_controls = slap_known_controls;
+
+               for ( i = 0; slap_known_controls[ i ]; i++ ) {
+                       int     cid;
+
+                       if ( slap_find_control_id( slap_known_controls[ i ], &cid )
+                                       == LDAP_CONTROL_NOT_FOUND )
+                       {
+                               assert( 0 );
+                               return -1;
+                       }
+
+                       frontendDB->bd_info->bi_ctrls[ cid ] = 1;
+                       frontendDB->be_ctrls[ cid ] = 1;
+               }
+       }
 
        /* calls */
        frontendDB->bd_info->bi_op_abandon = fe_op_abandon;
index 08566e473071d1903dd03efd7aed33dc286d023f..df92358c077a04af719a3ba7c0944e83536c78cc 100644 (file)
@@ -1527,6 +1527,10 @@ typedef struct syncinfo_s {
 
 LDAP_TAILQ_HEAD( be_pcl, slap_csn_entry );
 
+#ifndef SLAP_MAX_CIDS
+#define        SLAP_MAX_CIDS   32      /* Maximum number of supported controls */
+#endif
+
 struct slap_backend_db {
        BackendInfo     *bd_info;       /* pointer to shared backend info */
 
@@ -1568,7 +1572,12 @@ struct slap_backend_db {
        /* NOTE: this stores a duplicate of the control OIDs as listed
         * in bd_info->bi_controls at database startup; later on,
         * controls may be added run-time, e.g. by overlays */
+#if 0
        char            **be_controls;
+#endif
+       /* note: set to 0 if the database does not support the control;
+        * be_ctrls[SLAP_MAX_CIDS] is set to 1 if initialized */
+       char            be_ctrls[SLAP_MAX_CIDS + 1];
 
 #define                be_connection_init      bd_info->bi_connection_init
 #define                be_connection_destroy   bd_info->bi_connection_destroy
@@ -2017,7 +2026,8 @@ struct slap_backend_info {
 #define SLAP_NOLASTMODCMD(be)  (SLAP_BFLAGS(be) & SLAP_BFLAG_NOLASTMODCMD)
 #define SLAP_LASTMODCMD(be)    (!SLAP_NOLASTMODCMD(be))
 
-       char **bi_controls;             /* supported controls */
+       char    **bi_controls;          /* supported controls */
+       char    bi_ctrls[SLAP_MAX_CIDS + 1];
 
        unsigned int bi_nDB;    /* number of databases of this type */
        void    *bi_private;    /* anything the backend type needs */
@@ -2103,10 +2113,6 @@ typedef struct slap_gacl {
        char ga_ndn[1];
 } GroupAssertion;
 
-#ifndef SLAP_MAX_CIDS
-#define        SLAP_MAX_CIDS   32      /* Maximum number of supported controls */
-#endif
-
 struct slap_control_ids {
        int sc_assert;
        int sc_preRead;