]> git.sur5r.net Git - openldap/blobdiff - tests/progs/slapd-modrdn.c
tavl_delete: copy balance factor
[openldap] / tests / progs / slapd-modrdn.c
index 26082d99a6d33474a10656d856ff0d1a44d0282a..06b513044269dbbc68033bde43a79533149ab6bf 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2003 The OpenLDAP Foundation.
+ * Copyright 1999-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <ac/unistd.h>
 #include <ac/wait.h>
 
+#define LDAP_DEPRECATED 1
 #include <ldap.h>
 
 #define LOOPS  100
+#define RETRIES        0
 
 static void
-do_modrdn( char *uri, char *host, int port, char *manager, char *passwd, char *entry, int maxloop );
+do_modrdn( char *uri, char *host, int port, char *manager, char *passwd,
+               char *entry, int maxloop, int maxretries, int delay );
 
 static void
 usage( char *name )
 {
-       fprintf( stderr, "usage: %s [-h <host>] -p port -D <managerDN> -w <passwd> -e <entry> [-l <loops>]\n",
+        fprintf( stderr,
+               "usage: %s "
+               "-H <uri> | ([-h <host>] -p <port>) "
+               "-D <manager> "
+               "-w <passwd> "
+               "-e <entry> "
+               "[-l <loops>] "
+               "[-r <maxretries>] "
+               "[-t <delay>]\n",
                        name );
        exit( EXIT_FAILURE );
 }
@@ -50,43 +61,56 @@ main( int argc, char **argv )
 {
        int             i;
        char            *uri = NULL;
-       char        *host = "localhost";
-       int                     port = -1;
+       char            *host = "localhost";
+       int             port = -1;
        char            *manager = NULL;
        char            *passwd = NULL;
        char            *entry = NULL;
-       int                     loops = LOOPS;
+       int             loops = LOOPS;
+       int             retries = RETRIES;
+       int             delay = 0;
 
-       while ( (i = getopt( argc, argv, "H:h:p:D:w:e:l:" )) != EOF ) {
+       while ( (i = getopt( argc, argv, "H:h:p:D:w:e:l:r:t:" )) != EOF ) {
                switch( i ) {
-                       case 'H':               /* the server uri */
-                               uri = strdup( optarg );
+               case 'H':               /* the server uri */
+                       uri = strdup( optarg );
                        break;
-                       case 'h':               /* the servers host */
-                               host = strdup( optarg );
+
+               case 'h':               /* the servers host */
+                       host = strdup( optarg );
+                       break;
+
+               case 'p':               /* the servers port */
+                       port = atoi( optarg );
                        break;
 
-                       case 'p':               /* the servers port */
-                               port = atoi( optarg );
-                               break;
-                       case 'D':               /* the servers manager */
-                               manager = strdup( optarg );
+               case 'D':               /* the servers manager */
+                       manager = strdup( optarg );
                        break;
 
-                       case 'w':               /* the server managers password */
-                               passwd = strdup( optarg );
+               case 'w':               /* the server managers password */
+                       passwd = strdup( optarg );
                        break;
-                       case 'e':               /* entry to rename */
-                               entry = strdup( optarg );
-                               break;
 
-                       case 'l':               /* the number of loops */
-                               loops = atoi( optarg );
-                               break;
+               case 'e':               /* entry to rename */
+                       entry = strdup( optarg );
+                       break;
+
+               case 'l':               /* the number of loops */
+                       loops = atoi( optarg );
+                       break;
 
-                       default:
-                               usage( argv[0] );
-                               break;
+               case 'r':               /* the number of retries */
+                       retries = atoi( optarg );
+                       break;
+
+               case 't':               /* delay in seconds */
+                       delay = atoi( optarg );
+                       break;
+
+               default:
+                       usage( argv[0] );
+                       break;
                }
        }
 
@@ -101,20 +125,22 @@ main( int argc, char **argv )
 
        }
 
-       do_modrdn( uri, host, port, manager, passwd, entry, loops );
+       do_modrdn( uri, host, port, manager, passwd, entry, loops, retries, delay );
        exit( EXIT_SUCCESS );
 }
 
 
 static void
 do_modrdn( char *uri, char *host, int port, char *manager,
-       char *passwd, char *entry, int maxloop )
+       char *passwd, char *entry, int maxloop, int maxretries, int delay )
 {
        LDAP    *ld = NULL;
-       int     i;
+       int     i = 0, do_retry = maxretries;
        pid_t   pid;
        char *DNs[2];
        char *rdns[2];
+       int         rc = LDAP_SUCCESS;
+
 
        pid = getpid();
        DNs[0] = entry;
@@ -138,7 +164,8 @@ do_modrdn( char *uri, char *host, int port, char *manager,
                rdns[0] = strdup( DNs[1] );
                DNs[1][i] = ',';
        }
-               
+
+retry:;
        if ( uri ) {
                ldap_initialize( &ld, uri );
        } else {
@@ -155,33 +182,55 @@ do_modrdn( char *uri, char *host, int port, char *manager,
                        &version ); 
        }
 
-       if ( ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE ) != LDAP_SUCCESS ) {
-               ldap_perror( ld, "ldap_bind" );
-                exit( EXIT_FAILURE );
+       if ( do_retry == maxretries ) {
+               fprintf( stderr, "PID=%ld - Modrdn(%d): entry=\"%s\".\n",
+                       (long) pid, maxloop, entry );
        }
 
+       rc = ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE );
+       if ( rc != LDAP_SUCCESS ) {
+               ldap_perror( ld, "ldap_bind" );
+               switch ( rc ) {
+               case LDAP_BUSY:
+               case LDAP_UNAVAILABLE:
+                       if ( do_retry > 0 ) {
+                               do_retry--;
+                               if ( delay > 0) {
+                                   sleep( delay );
+                               }
+                               goto retry;
+                       }
+               /* fallthru */
+               default:
+                       break;
+               }
+               exit( EXIT_FAILURE );
+       }
 
-       fprintf( stderr, "PID=%ld - Modrdn(%d): entry=\"%s\".\n",
-                (long) pid, maxloop, entry );
-
-       for ( i = 0; i < maxloop; i++ ) {
-               int         rc;
-
-               if (( rc = ldap_modrdn2_s( ld, DNs[0], rdns[0], 0 ))
-                       != LDAP_SUCCESS ) {
+       for ( ; i < maxloop; i++ ) {
+               rc = ldap_modrdn2_s( ld, DNs[0], rdns[0], 0 );
+               if ( rc != LDAP_SUCCESS ) {
                        ldap_perror( ld, "ldap_modrdn" );
+                       if ( rc == LDAP_BUSY && do_retry > 0 ) {
+                               do_retry--;
+                               goto retry;
+                       }
                        if ( rc != LDAP_NO_SUCH_OBJECT ) break;
                        continue;
                }
-               if (( rc = ldap_modrdn2_s( ld, DNs[1], rdns[1], 1 ))
-                       != LDAP_SUCCESS ) {
+               rc = ldap_modrdn2_s( ld, DNs[1], rdns[1], 1 );
+               if ( rc != LDAP_SUCCESS ) {
                        ldap_perror( ld, "ldap_modrdn" );
+                       if ( rc == LDAP_BUSY && do_retry > 0 ) {
+                               do_retry--;
+                               goto retry;
+                       }
                        if ( rc != LDAP_NO_SUCH_OBJECT ) break;
                        continue;
                }
        }
 
-       fprintf( stderr, " PID=%ld - Modrdn done.\n", (long) pid );
+       fprintf( stderr, " PID=%ld - Modrdn done (%d).\n", (long) pid, rc );
 
        ldap_unbind( ld );
 }