X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapcat.c;h=af1cae4993e4f17c6d4703ffc382c0659ceaea56;hb=8a197d1a6c4f43925adf0a1372651b529081f6ae;hp=6ea1952006502541080756408981bf00ea2f8039;hpb=19ad1e2a741d8802cd5272024a3353f35f869be6;p=openldap diff --git a/servers/slapd/slapcat.c b/servers/slapd/slapcat.c index 6ea1952006..af1cae4993 100644 --- a/servers/slapd/slapcat.c +++ b/servers/slapd/slapcat.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2008 The OpenLDAP Foundation. + * Copyright 1998-2010 The OpenLDAP Foundation. * Portions Copyright 1998-2003 Kurt D. Zeilenga. * Portions Copyright 2003 IBM Corporation. * All rights reserved. @@ -47,9 +47,13 @@ slapcat( int argc, char **argv ) int rc = EXIT_SUCCESS; Operation op = {0}; const char *progname = "slapcat"; + int requestBSF; + int doBSF = 0; slap_tool_init( progname, SLAPCAT, argc, argv ); + requestBSF = ( sub_ndn.bv_len || filter ); + #ifdef SIGPIPE (void) SIGNAL( SIGPIPE, slapcat_sig ); #endif @@ -61,7 +65,7 @@ slapcat( int argc, char **argv ) if( !be->be_entry_open || !be->be_entry_close || - !be->be_entry_first || + !( be->be_entry_first_x || be->be_entry_first ) || !be->be_entry_next || !be->be_entry_get ) { @@ -77,9 +81,22 @@ slapcat( int argc, char **argv ) } 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 ) ) { char *data; int len; @@ -96,20 +113,24 @@ slapcat( 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 ) { + if ( verbose ) { printf( "# id=%08lx\n", (long) id ); } @@ -134,6 +155,7 @@ slapcat( int argc, char **argv ) be->be_entry_close( be ); - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return rc; }