From 04093d38bed7855cb828eb9b0b4d1abff4597535 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Mon, 3 Jan 2011 21:18:14 +0000 Subject: [PATCH] ITS#6482 --- CHANGES | 3 ++- doc/man/man8/slapcat.8 | 5 +++++ servers/slapd/slapcat.c | 18 ++++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 8b40f8143e..db7d04c192 100644 --- a/CHANGES +++ b/CHANGES @@ -3,9 +3,10 @@ OpenLDAP 2.4 Change Log OpenLDAP 2.4.24 Engineering Added contrib/noopsrch for entry counting (ITS#6598) Added slapadd attribute value checking (ITS#6592) + Added slapcat continue mode for problematic DBs (ITS#6482) Added slapd-null back-config support (ITS#6624) Added slapd-sql autocommit support (ITS#6612) - Addes slapd-sql support for long long keys (ITS#6617) + Added slapd-sql support for long long keys (ITS#6617) Fixed liblber to not close invalid sockets (ITS#6585) Fixed libldap dnssrv port format specifier (ITS#6644) Fixed libldap EOF handling (ITS#6723) diff --git a/doc/man/man8/slapcat.8 b/doc/man/man8/slapcat.8 index 4673e49118..02e64c8988 100644 --- a/doc/man/man8/slapcat.8 +++ b/doc/man/man8/slapcat.8 @@ -82,6 +82,11 @@ option. .TP .B \-c Enable continue (ignore errors) mode. +Multiple occorrences of +.B \-c +make +.BR slapcat (8) +try harder. .TP .BI \-d \ debug-level Enable debugging messages as defined by the specified diff --git a/servers/slapd/slapcat.c b/servers/slapd/slapcat.c index af1cae4993..c4e7a7d658 100644 --- a/servers/slapd/slapcat.c +++ b/servers/slapd/slapcat.c @@ -109,8 +109,22 @@ slapcat( int argc, char **argv ) if ( e == NULL ) { printf("# no data for entry id=%08lx\n\n", (long) id ); rc = EXIT_FAILURE; - if( continuemode ) continue; - break; + if ( continuemode == 0 ) { + break; + + } else if ( continuemode == 1 ) { + continue; + } + + /* this is a last resort: linearly scan all ids + * trying to recover as much as possible (ITS#6482) */ + while ( ++id != NOID ) { + e = be->be_entry_get( be, id ); + if ( e != NULL ) break; + printf("# no data for entry id=%08lx\n\n", (long) id ); + } + + if ( e == NULL ) break; } if ( doBSF ) { -- 2.39.5