use direct access instead of string comparison to check supported controls

This commit is contained in:
Pierangelo Masarati 2005-01-29 17:58:48 +00:00
parent 25b15e0014
commit d0b804c439
5 changed files with 88 additions and 48 deletions

View 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;

View 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

View 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;

View 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;

View 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;