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;
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 */
{
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 );
}
}
}
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;
}
}
}
}
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",
return rc;
}
}
+
+ (void)backend_init_controls( &backendInfo[i] );
}
ldap_pvt_thread_mutex_init( &slapd_rq.rq_mutex );
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 );
}
} 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
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 */
/* 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
#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 */
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;