-/*
- * Delete all the children of an entry recursively until leaf nodes are reached.
- *
- */
-static int deletechildren( LDAP *ld,
- char *dn )
-{
- LDAPMessage *res, *e;
- int entries;
- int rc;
- int timeout = 30 * 10000;
-
- ldap_set_option( ld, LDAP_OPT_TIMEOUT, &timeout );
- if ( verbose ) printf ( "deleting children of: %s\n", dn );
- /*
- * Do a one level search at dn for children. For each, delete its children.
- */
- if ( ldap_search_s( ld, dn, LDAP_SCOPE_ONELEVEL, NULL, NULL, 0, &res ) == -1 )
- {
- ldap_perror( ld, "ldap_search" );
- ldap_get_option( ld, LDAP_OPT_ERROR_NUMBER, &rc );
- return( rc );
- }
-
- entries = ldap_count_entries( ld, res );
- if ( entries > 0 )
- {
- int i;
-
- for (e = ldap_first_entry( ld, res ), i = 0; e != NULL;
- e = ldap_next_entry( ld, e ), i++ )
- {
- if ( (rc = deletechildren( ld, ldap_get_dn( ld, e) )) == -1 )
- {
- ldap_perror( ld, "ldap_prune" );
- return rc;
- }
- if ( verbose )
- {
- printf( "\tremoving %s\n", ldap_get_dn( ld, e ) );
- }
- if ( ( rc = ldap_delete_s( ld, ldap_get_dn( ld, e ) ) ) == -1 )
- {
- ldap_perror( ld, "ldap_delete" );
- return rc;
- }
- else if ( verbose )
- {
- printf( "\t%s removed\n", ldap_get_dn( ld, e ) );
- }
- }
- }
- ldap_msgfree( res );
- return rc;
+ entries = ldap_count_entries( ld, res );
+
+ if ( entries > 0 ) {
+ int i;
+
+ for (e = ldap_first_entry( ld, res ), i = 0; e != NULL;
+ e = ldap_next_entry( ld, e ), i++ )
+ {
+ char *dn = ldap_get_dn( ld, e );
+
+ if( dn == NULL ) {
+ ldap_get_option( ld, LDAP_OPT_RESULT_CODE, &rc );
+ tool_perror( "ldap_prune", rc, NULL, NULL, NULL, NULL );
+ ber_memfree( dn );
+ return rc;
+ }
+
+ rc = deletechildren( ld, dn, 0 );
+ if ( rc != LDAP_SUCCESS ) {
+ tool_perror( "ldap_prune", rc, NULL, NULL, NULL, NULL );
+ ber_memfree( dn );
+ return rc;
+ }
+
+ if ( verbose ) {
+ printf( _("\tremoving %s\n"), dn );
+ }
+
+ rc = ldap_delete_ext_s( ld, dn, NULL, NULL );
+ if ( rc != LDAP_SUCCESS ) {
+ tool_perror( "ldap_delete", rc, NULL, NULL, NULL, NULL );
+ ber_memfree( dn );
+ return rc;
+
+ }
+
+ if ( verbose ) {
+ printf( _("\t%s removed\n"), dn );
+ }
+
+ ber_memfree( dn );
+ }
+ }
+
+ ldap_msgfree( res );
+
+ if ( srch_rc == LDAP_SIZELIMIT_EXCEEDED ) {
+ goto more;
+ }
+
+ return rc;