diff --git a/clients/tools/common.c b/clients/tools/common.c index 2658fcd2bcbafa0e341bdc61fddb314a29f037c4..f77a1ea26255eb024bc2533580b5efc141c56ce7 100644 --- a/clients/tools/common.c +++ b/clients/tools/common.c @@ -182,6 +182,8 @@ static struct tool_ctrls_t { enum { Intr_None = 0, Intr_Abandon, Intr_Cancel, Intr_Ignore }; static volatile sig_atomic_t gotintr, abcan; +int backlog; + #ifdef LDAP_CONTROL_X_SESSION_TRACKING static int @@ -672,6 +674,13 @@ tool_args( int argc, char **argv ) gotintr = abcan; } + } else if ( strcasecmp( control, "backlog" ) == 0 ) { + /* special search: accumulate lots of responses + * but don't read any, force slapd writer to wait. + * Then abandon the search and issue a new one. + */ + backlog = 1; + } else if ( tool_is_oid( control ) ) { LDAPControl *tmpctrls, ctrl; diff --git a/clients/tools/common.h b/clients/tools/common.h index 997e73df8e7d5c6c392d84346447334c39118f5f..9ac3c9388f8c9d227c33687be065874930eabaee 100644 --- a/clients/tools/common.h +++ b/clients/tools/common.h @@ -98,6 +98,9 @@ extern ber_int_t vlvPos; extern ber_int_t vlvCount; extern struct berval *vlvContext; +/* features */ +extern int backlog; + /* options */ extern struct timeval nettimeout; diff --git a/clients/tools/ldapsearch.c b/clients/tools/ldapsearch.c index 0b2c5e018d8d1301373506e1a8c5f4d8d6a735d3..05f1b327e494da6006e0d3627fffb3c67dbe8bb3 100644 --- a/clients/tools/ldapsearch.c +++ b/clients/tools/ldapsearch.c @@ -1420,6 +1420,7 @@ static int dosearch( tv_timelimitp = &tv_timelimit; } +again: rc = ldap_search_ext( ld, base, scope, filter, attrs, attrsonly, sctrls, cctrls, tv_timelimitp, sizelimit, &msgid ); @@ -1443,6 +1444,21 @@ static int dosearch( tvp = &tv; } + if ( backlog == 1 ) { + printf( _("\nWaiting for responses to accumulate, press Enter to continue: ")); + fflush( stdout ); + getchar(); + printf( _("Abandoning msgid %d\n"), msgid ); + ldap_abandon_ext( ld, msgid, NULL, NULL ); + /* turn off syncrepl control */ + ldap_set_option( ld, LDAP_OPT_SERVER_CONTROLS, NULL ); + backlog = 2; + scope = LDAP_SCOPE_BASE; + goto again; + } else if ( backlog == 2 ) { + tv.tv_sec = timelimit; + } + while ((rc = ldap_result( ld, LDAP_RES_ANY, sortattr ? LDAP_MSG_ALL : LDAP_MSG_ONE, tvp, &res )) > 0 )