]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapschema.c
Plug mutex/rwlock leaks (destroy them)
[openldap] / servers / slapd / slapschema.c
index a7aa035b6c1975725bb7a9517aec2284253ba82b..8ed4204a16ce8bba5463db9903a1495b85673670 100644 (file)
@@ -50,9 +50,13 @@ slapschema( int argc, char **argv )
        OperationBuffer opbuf;
        Operation *op = NULL;
        void *thrctx;
+       int requestBSF = 0;
+       int doBSF = 0;
 
        slap_tool_init( progname, SLAPCAT, argc, argv );
 
+       requestBSF = ( sub_ndn.bv_len || filter );
+
 #ifdef SIGPIPE
        (void) SIGNAL( SIGPIPE, slapcat_sig );
 #endif
@@ -64,7 +68,7 @@ slapschema( int argc, char **argv )
 
        if( !be->be_entry_open ||
                !be->be_entry_close ||
-               !be->be_entry_first ||
+               !( be->be_entry_first || be->be_entry_first_x ) ||
                !be->be_entry_next ||
                !be->be_entry_get )
        {
@@ -85,10 +89,23 @@ slapschema( int argc, char **argv )
        op->o_tmpmemctx = NULL;
        op->o_bd = be;
 
-       for ( id = be->be_entry_first( be );
-               id != NOID;
-               id = be->be_entry_next( be ) )
-       {
+
+       if ( !requestBSF && be->be_entry_first ) {
+               id = be->be_entry_first( be );
+
+       } else {
+               if ( be->be_entry_first_x ) {
+                       id = be->be_entry_first_x( be,
+                               sub_ndn.bv_len ? &sub_ndn : NULL, scope, filter );
+
+               } else {
+                       assert( be->be_entry_first != NULL );
+                       doBSF = 1;
+                       id = be->be_entry_first( be );
+               }
+       }
+
+       for ( ; id != NOID; id = be->be_entry_next( be ) ) {
                Entry* e;
                char textbuf[SLAP_TEXT_BUFLEN];
                size_t textlen = sizeof(textbuf);
@@ -105,17 +122,21 @@ slapschema( int argc, char **argv )
                        break;
                }
 
-               if( sub_ndn.bv_len && !dnIsSuffix( &e->e_nname, &sub_ndn ) ) {
-                       be_entry_release_r( op, e );
-                       continue;
-               }
-
-               if( filter != NULL ) {
-                       int rc = test_filter( NULL, e, filter );
-                       if( rc != LDAP_COMPARE_TRUE ) {
+               if ( doBSF ) {
+                       if ( sub_ndn.bv_len && !dnIsSuffixScope( &e->e_nname, &sub_ndn, scope ) )
+                       {
                                be_entry_release_r( op, e );
                                continue;
                        }
+
+
+                       if ( filter != NULL ) {
+                               int rc = test_filter( NULL, e, filter );
+                               if ( rc != LDAP_COMPARE_TRUE ) {
+                                       be_entry_release_r( op, e );
+                                       continue;
+                               }
+                       }
                }
 
                if( verbose ) {