]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backend.c
Fix ITS#3424
[openldap] / servers / slapd / backend.c
index 50478f33e8c986d5182f7ab6f20173ed9e997220..d04e0041a8b33a4dd10e4b5306f795a55666936f 100644 (file)
@@ -56,107 +56,24 @@ static void call_group_postop_plugins( Operation *op );
  * imported into slapd without appropriate __declspec(dllimport) directives.
  */
 
-#if SLAPD_BDB == SLAPD_MOD_STATIC
-#include "back-bdb/external.h"
-#endif
-#if SLAPD_DNSSRV == SLAPD_MOD_STATIC
-#include "back-dnssrv/external.h"
-#endif
-#if SLAPD_HDB == SLAPD_MOD_STATIC
-#include "back-hdb/external.h"
-#endif
-#if SLAPD_LDAP == SLAPD_MOD_STATIC
-#include "back-ldap/external.h"
-#endif
-#if SLAPD_LDBM == SLAPD_MOD_STATIC
-#include "back-ldbm/external.h"
-#endif
-#if SLAPD_META == SLAPD_MOD_STATIC
-#include "back-meta/external.h"
-#endif
-#if SLAPD_MONITOR == SLAPD_MOD_STATIC
-#include "back-monitor/external.h"
-#endif
-#if SLAPD_NULL == SLAPD_MOD_STATIC
-#include "back-null/external.h"
-#endif
-#if SLAPD_PASSWD == SLAPD_MOD_STATIC
-#include "back-passwd/external.h"
-#endif
-#if SLAPD_PERL == SLAPD_MOD_STATIC
-#include "back-perl/external.h"
-#endif
-#if SLAPD_RELAY == SLAPD_MOD_STATIC
-#include "back-relay/external.h"
-#endif
-#if SLAPD_SHELL == SLAPD_MOD_STATIC
-#include "back-shell/external.h"
-#endif
-#if SLAPD_TCL == SLAPD_MOD_STATIC
-#include "back-tcl/external.h"
-#endif
-#if SLAPD_SQL == SLAPD_MOD_STATIC
-#include "back-sql/external.h"
-#endif
-#if SLAPD_PRIVATE == SLAPD_MOD_STATIC
-#include "private/external.h"
-#endif
+/*
+ * This file is automatically generated by configure; it defines
+ * the BackendInfo binfo[] structure with the configured static 
+ * backend info.  It assumes that every backend of type <name> 
+ * provides an initialization function
+ *
+ *     int name_back_initialize( BackendInfo *bi )
+ *
+ * that populates the rest of the structure.
+ */
 
-static BackendInfo binfo[] = {
-#if SLAPD_BDB == SLAPD_MOD_STATIC
-       {"bdb", bdb_initialize},
-#endif
-#if SLAPD_DNSSRV == SLAPD_MOD_STATIC
-       {"dnssrv",      dnssrv_back_initialize},
-#endif
-#if SLAPD_HDB == SLAPD_MOD_STATIC
-       {"hdb", hdb_initialize},
-#endif
-#if SLAPD_LDAP == SLAPD_MOD_STATIC
-       {"ldap",        ldap_back_initialize},
-#endif
-#if SLAPD_LDBM == SLAPD_MOD_STATIC
-       {"ldbm",        ldbm_back_initialize},
-#endif
-#if SLAPD_META == SLAPD_MOD_STATIC
-       {"meta",        meta_back_initialize},
-#endif
-#if SLAPD_MONITOR == SLAPD_MOD_STATIC
-       {"monitor",     monitor_back_initialize},
-#endif
-#if SLAPD_NULL == SLAPD_MOD_STATIC
-       {"null",        null_back_initialize},
-#endif
-#if SLAPD_PASSWD == SLAPD_MOD_STATIC
-       {"passwd",      passwd_back_initialize},
-#endif
-#if SLAPD_PERL == SLAPD_MOD_STATIC
-       {"perl",        perl_back_initialize},
-#endif
-#if SLAPD_RELAY == SLAPD_MOD_STATIC
-       {"relay",       relay_back_initialize},
-#endif
-#if SLAPD_SHELL == SLAPD_MOD_STATIC
-       {"shell",       shell_back_initialize},
-#endif
-#if SLAPD_TCL == SLAPD_MOD_STATIC
-       {"tcl",         tcl_back_initialize},
-#endif
-#if SLAPD_SQL == SLAPD_MOD_STATIC
-       {"sql",         backsql_initialize},
-#endif
-       /* for any private backend */
-#if SLAPD_PRIVATE == SLAPD_MOD_STATIC
-       {"private",     private_back_initialize},
-#endif
-       {NULL}
-};
+#include "backend.h"
 
 int                    nBackendInfo = 0;
-BackendInfo    *backendInfo = NULL;
+BackendInfo            *backendInfo = NULL;
 
 int                    nBackendDB = 0; 
-BackendDB      *backendDB = NULL;
+BackendDB              *backendDB = NULL;
 
 ldap_pvt_thread_pool_t syncrepl_pool;
 int                    syncrepl_pool_max = SLAP_MAX_SYNCREPL_THREADS;
@@ -266,8 +183,6 @@ int backend_startup_one(Backend *be)
 
        be->be_pending_csn_list = (struct be_pcl *)
                ch_calloc( 1, sizeof( struct be_pcl ));
-       build_new_dn( &be->be_context_csn, be->be_nsuffix,
-               (struct berval *)&slap_ldapsync_cn_bv, NULL );
 
        LDAP_TAILQ_INIT( be->be_pending_csn_list );
 
@@ -344,9 +259,9 @@ int backend_startup(Backend *be)
                }
        }
 
-       ldap_pvt_thread_mutex_init( &syncrepl_rq.rq_mutex );
-       LDAP_STAILQ_INIT( &syncrepl_rq.task_list );
-       LDAP_STAILQ_INIT( &syncrepl_rq.run_list );
+       ldap_pvt_thread_mutex_init( &slapd_rq.rq_mutex );
+       LDAP_STAILQ_INIT( &slapd_rq.task_list );
+       LDAP_STAILQ_INIT( &slapd_rq.run_list );
 
        /* open each backend database */
        for( i = 0; i < nBackendDB; i++ ) {
@@ -378,10 +293,10 @@ int backend_startup(Backend *be)
                        LDAP_STAILQ_FOREACH( si, &backendDB[i].be_syncinfo, si_next ) {
                                si->si_be = &backendDB[i];
                                init_syncrepl( si );
-                               ldap_pvt_thread_mutex_lock( &syncrepl_rq.rq_mutex );
-                               ldap_pvt_runqueue_insert( &syncrepl_rq,
+                               ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+                               ldap_pvt_runqueue_insert( &slapd_rq,
                                                si->si_interval, do_syncrepl, (void *) si );
-                               ldap_pvt_thread_mutex_unlock( &syncrepl_rq.rq_mutex );
+                               ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
                        }
                }
        }
@@ -469,11 +384,32 @@ int backend_destroy(void)
 {
        int i;
        BackendDB *bd;
+       syncinfo_t *si_entry;
+       struct slap_csn_entry *csne;
 
        ldap_pvt_thread_pool_destroy( &syncrepl_pool, 1 );
 
        /* destroy each backend database */
        for( i = 0, bd = backendDB; i < nBackendDB; i++, bd++ ) {
+
+               while ( !LDAP_STAILQ_EMPTY( &bd->be_syncinfo )) {
+                       si_entry = LDAP_STAILQ_FIRST( &bd->be_syncinfo );
+                       LDAP_STAILQ_REMOVE_HEAD( &bd->be_syncinfo, si_next );
+                       syncinfo_free( si_entry );
+               }
+
+               if ( bd->be_pending_csn_list ) {
+                       csne = LDAP_TAILQ_FIRST( bd->be_pending_csn_list );
+                       while ( csne ) {
+                               struct slap_csn_entry *tmp_csne = csne;
+
+                               LDAP_TAILQ_REMOVE( bd->be_pending_csn_list, csne, ce_csn_link );
+                               ch_free( csne->ce_csn.bv_val );
+                               csne = LDAP_TAILQ_NEXT( csne, ce_csn_link );
+                               ch_free( tmp_csne );
+                       }
+               }
+               
                if ( bd->bd_info->bi_db_destroy ) {
                        bd->bd_info->bi_db_destroy( bd );
                }
@@ -482,7 +418,6 @@ int backend_destroy(void)
                if ( bd->be_rootdn.bv_val ) free( bd->be_rootdn.bv_val );
                if ( bd->be_rootndn.bv_val ) free( bd->be_rootndn.bv_val );
                if ( bd->be_rootpw.bv_val ) free( bd->be_rootpw.bv_val );
-               if ( bd->be_context_csn.bv_val ) free( bd->be_context_csn.bv_val );
                acl_destroy( bd->be_acl, frontendDB->be_acl );
        }
        free( backendDB );
@@ -506,15 +441,17 @@ int backend_destroy(void)
 
        /* destroy frontend database */
        bd = frontendDB;
-       if ( bd->bd_info->bi_db_destroy ) {
-               bd->bd_info->bi_db_destroy( bd );
+       if ( bd ) {
+               if ( bd->bd_info->bi_db_destroy ) {
+                       bd->bd_info->bi_db_destroy( bd );
+               }
+               ber_bvarray_free( bd->be_suffix );
+               ber_bvarray_free( bd->be_nsuffix );
+               if ( bd->be_rootdn.bv_val ) free( bd->be_rootdn.bv_val );
+               if ( bd->be_rootndn.bv_val ) free( bd->be_rootndn.bv_val );
+               if ( bd->be_rootpw.bv_val ) free( bd->be_rootpw.bv_val );
+               acl_destroy( bd->be_acl, frontendDB->be_acl );
        }
-       ber_bvarray_free( bd->be_suffix );
-       ber_bvarray_free( bd->be_nsuffix );
-       if ( bd->be_rootdn.bv_val ) free( bd->be_rootdn.bv_val );
-       if ( bd->be_rootndn.bv_val ) free( bd->be_rootndn.bv_val );
-       if ( bd->be_rootpw.bv_val ) free( bd->be_rootpw.bv_val );
-       acl_destroy( bd->be_acl, frontendDB->be_acl );
 
        return 0;
 }
@@ -573,8 +510,6 @@ backend_db_init(
        be->be_requires = frontendDB->be_requires;
        be->be_ssf_set = frontendDB->be_ssf_set;
 
-       be->be_context_csn.bv_len = 0;
-       be->be_context_csn.bv_val = NULL;
        be->be_pcl_mutexp = &be->be_pcl_mutex;
        ldap_pvt_thread_mutex_init( be->be_pcl_mutexp );
 
@@ -1311,6 +1246,9 @@ backend_group(
                                if ( target && dn_match( &target->e_nname, op_ndn ) ) {
                                        user = target;
                                } else {
+                                       /* back-bdb stored lockinfo here, we saved it
+                                        * above. Clear it out so that a new lock can be used.
+                                        */
                                        op->o_bd = select_backend( op_ndn, 0, 0 );
                                        rc = be_entry_get_rw(op, op_ndn, NULL, NULL, 0, &user );
                                }
@@ -1319,7 +1257,7 @@ backend_group(
                                        rc = 1;
                                        for (i=0; a->a_vals[i].bv_val; i++) {
                                                if ( ldap_url_parse( a->a_vals[i].bv_val, &ludp ) !=
-                                                       LDAP_SUCCESS )
+                                                       LDAP_URL_SUCCESS )
                                                {
                                                        continue;
                                                }
@@ -1350,8 +1288,8 @@ backend_group(
                                                        break;
 #ifdef LDAP_SCOPE_SUBORDINATE
                                                case LDAP_SCOPE_SUBORDINATE:
-                                                       if ( dn_match( &nbase, op_ndn ) &&
-                                                               !dnIsSuffix(op_ndn, &nbase ))
+                                                       if ( dn_match( &nbase, op_ndn ) ||
+                                                               !dnIsSuffix( op_ndn, &nbase ) )
                                                        {
                                                                goto loopit;
                                                        }
@@ -1563,6 +1501,7 @@ int backend_operational(
 {
        Attribute       **ap;
        int             rc = 0;
+       BackendDB *be_orig;
 
        for ( ap = &rs->sr_operational_attrs; *ap; ap = &(*ap)->a_next )
                /* just count them */ ;
@@ -1573,14 +1512,26 @@ int backend_operational(
         * add them to the attribute list
         */
        if ( SLAP_OPATTRS( rs->sr_attr_flags ) || ( op->ors_attrs &&
-               ad_inlist( slap_schema.si_ad_subschemaSubentry, op->ors_attrs )) ) {
-               *ap = slap_operational_subschemaSubentry( op->o_bd );
+               ad_inlist( slap_schema.si_ad_entryDN, op->ors_attrs )))
+       {
+               *ap = slap_operational_entryDN( rs->sr_entry );
+               ap = &(*ap)->a_next;
+       }
 
+       if ( SLAP_OPATTRS( rs->sr_attr_flags ) || ( op->ors_attrs &&
+               ad_inlist( slap_schema.si_ad_subschemaSubentry, op->ors_attrs )))
+       {
+               *ap = slap_operational_subschemaSubentry( op->o_bd );
                ap = &(*ap)->a_next;
        }
 
-       if ( ( SLAP_OPATTRS( rs->sr_attr_flags ) || op->ors_attrs ) && op->o_bd &&
-               op->o_bd->be_operational != NULL )
+       /* Let the overlays have a chance at this */
+       be_orig = op->o_bd;
+       if ( SLAP_ISOVERLAY( be_orig ))
+               op->o_bd = select_backend( be_orig->be_nsuffix, 0, 0 );
+
+       if (( SLAP_OPATTRS( rs->sr_attr_flags ) || op->ors_attrs ) &&
+               op->o_bd && op->o_bd->be_operational != NULL )
        {
                Attribute       *a;
                
@@ -1595,6 +1546,7 @@ int backend_operational(
                for ( ; *ap; ap = &(*ap)->a_next )
                        /* just count them */ ;
        }
+       op->o_bd = be_orig;
 
        return rc;
 }
@@ -1604,17 +1556,23 @@ static void init_group_pblock( Operation *op, Entry *target,
        Entry *e, struct berval *op_ndn, AttributeDescription *group_at )
 {
        slapi_int_pblock_set_operation( op->o_pb, op );
-       slapi_pblock_set( op->o_pb, SLAPI_X_GROUP_ENTRY, (void *)e );
-       slapi_pblock_set( op->o_pb, SLAPI_X_GROUP_OPERATION_DN, (void *)op_ndn->bv_val );
-       slapi_pblock_set( op->o_pb, SLAPI_X_GROUP_ATTRIBUTE, (void *)group_at->ad_cname.bv_val );
-       slapi_pblock_set( op->o_pb, SLAPI_X_GROUP_TARGET_ENTRY, (void *)target );
+
+       slapi_pblock_set( op->o_pb,
+               SLAPI_X_GROUP_ENTRY, (void *)e );
+       slapi_pblock_set( op->o_pb,
+               SLAPI_X_GROUP_OPERATION_DN, (void *)op_ndn->bv_val );
+       slapi_pblock_set( op->o_pb,
+               SLAPI_X_GROUP_ATTRIBUTE, (void *)group_at->ad_cname.bv_val );
+       slapi_pblock_set( op->o_pb,
+               SLAPI_X_GROUP_TARGET_ENTRY, (void *)target );
 }
 
 static int call_group_preop_plugins( Operation *op )
 {
        int rc;
 
-       rc = slapi_int_call_plugins( op->o_bd, SLAPI_X_PLUGIN_PRE_GROUP_FN, op->o_pb );
+       rc = slapi_int_call_plugins( op->o_bd,
+               SLAPI_X_PLUGIN_PRE_GROUP_FN, op->o_pb );
        if ( rc < 0 ) {
                if (( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE,
                        (void *)&rc ) != 0 ) || rc == LDAP_SUCCESS )