/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2010 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
* Portions Copyright 1998-2003 Kurt D. Zeilenga.
* Portions Copyright 1998-2001 Net Boolean Incorporated.
* Portions Copyright 2001-2003 IBM Corporation.
fprintf( stderr, _("Could not set LDAP_OPT_DEREF %d\n"), deref );
exit( EXIT_FAILURE );
}
- if (timelimit > 0 &&
- ldap_set_option( ld, LDAP_OPT_TIMELIMIT, (void *) &timelimit )
- != LDAP_OPT_SUCCESS )
- {
- fprintf( stderr,
- _("Could not set LDAP_OPT_TIMELIMIT %d\n"), timelimit );
- exit( EXIT_FAILURE );
- }
- if (sizelimit > 0 &&
- ldap_set_option( ld, LDAP_OPT_SIZELIMIT, (void *) &sizelimit )
- != LDAP_OPT_SUCCESS )
- {
- fprintf( stderr,
- _("Could not set LDAP_OPT_SIZELIMIT %d\n"), sizelimit );
- exit( EXIT_FAILURE );
- }
}
int
tool_bind( ld );
getNextPage:
+ /* fp may have been closed, need to reopen if code jumps
+ * back here to getNextPage.
+ */
+ if ( !fp && infile ) {
+ if (( fp = fopen( infile, "r" )) == NULL ) {
+ perror( infile );
+ return EXIT_FAILURE;
+ }
+ }
save_nctrls = nctrls;
i = nctrls;
if ( nctrls > 0
if ( infile == NULL ) {
rc = dosearch( ld, base, scope, NULL, filtpattern,
- attrs, attrsonly, NULL, NULL, NULL, -1 );
+ attrs, attrsonly, NULL, NULL, NULL, sizelimit );
} else {
rc = 0;
first = 0;
}
rc1 = dosearch( ld, base, scope, filtpattern, line,
- attrs, attrsonly, NULL, NULL, NULL, -1 );
+ attrs, attrsonly, NULL, NULL, NULL, sizelimit );
if ( rc1 != 0 ) {
rc = rc1;
}
if ( fp != stdin ) {
fclose( fp );
+ fp = NULL;
}
}
if ( derefval.bv_val != NULL ) {
ldap_memfree( derefval.bv_val );
}
- if ( def_urlpre != NULL ) {
- ber_memfree( def_urlpre );
+ if ( urlpre != NULL ) {
+ if ( def_urlpre != urlpre )
+ free( def_urlpre );
+ free( urlpre );
}
if ( c ) {
int sizelimit )
{
char *filter;
- int rc;
+ int rc, rc2 = LDAP_OTHER;
int nresponses;
int nentries;
int nreferences;
struct berval *retdata = NULL;
int nresponses_psearch = -1;
int cancel_msgid = -1;
+ struct timeval tv, *tvp = NULL;
+ struct timeval tv_timelimit, *tv_timelimitp = NULL;
if( filtpatt != NULL ) {
size_t max_fsize = strlen( filtpatt ) + strlen( value ) + 1, outlen;
return LDAP_SUCCESS;
}
+ if ( timelimit > 0 ) {
+ tv_timelimit.tv_sec = timelimit;
+ tv_timelimit.tv_usec = 0;
+ tv_timelimitp = &tv_timelimit;
+ }
+
rc = ldap_search_ext( ld, base, scope, filter, attrs, attrsonly,
- sctrls, cctrls, timeout, sizelimit, &msgid );
+ sctrls, cctrls, tv_timelimitp, sizelimit, &msgid );
if ( filtpatt != NULL ) {
free( filter );
}
if( rc != LDAP_SUCCESS ) {
- fprintf( stderr, _("%s: ldap_search_ext: %s (%d)\n"),
- prog, ldap_err2string( rc ), rc );
+ tool_perror( "ldap_search_ext", rc, NULL, NULL, NULL, NULL );
return( rc );
}
res = NULL;
+ if ( timelimit > 0 ) {
+ /* disable timeout */
+ tv.tv_sec = -1;
+ tv.tv_usec = 0;
+ tvp = &tv;
+ }
+
while ((rc = ldap_result( ld, LDAP_RES_ANY,
sortattr ? LDAP_MSG_ALL : LDAP_MSG_ONE,
- NULL, &res )) > 0 )
+ tvp, &res )) > 0 )
{
- rc = tool_check_abandon( ld, msgid );
- if ( rc ) {
- return rc;
+ if ( tool_check_abandon( ld, msgid ) ) {
+ return -1;
}
if( sortattr ) {
/* pagedResults stuff is dealt with
* in tool_print_ctrls(), called by
* print_results(). */
- rc = print_result( ld, msg, 1 );
+ rc2 = print_result( ld, msg, 1 );
if ( ldapsync == LDAP_SYNC_REFRESH_AND_PERSIST ) {
break;
}
}
done:
- if ( rc == -1 ) {
- tool_perror( "ldap_result", rc, NULL, NULL, NULL, NULL );
- return( rc );
+ if ( tvp == NULL && rc != LDAP_RES_SEARCH_RESULT ) {
+ ldap_get_option( ld, LDAP_OPT_RESULT_CODE, (void *)&rc2 );
}
ldap_msgfree( res );
if( nreferences ) printf( _("# numReferences: %d\n"), nreferences );
}
- return( rc );
+ if ( rc != LDAP_RES_SEARCH_RESULT ) {
+ tool_perror( "ldap_result", rc2, NULL, NULL, NULL, NULL );
+ }
+
+ return( rc2 );
}
/* This is the proposed new way of doing things.
return err;
}
-