X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=tests%2Fprogs%2Fslapd-addel.c;h=c96cdccd3528ba2db1f464dff1fba86f36ea58ea;hb=6d6a4b7ddae7c38bfb231161a12410b925f60646;hp=881fb1d17a99b69c3544565f4e992c0024fa6975;hpb=6939c531700652491f4be4688c6a1f35a1ab8a18;p=openldap diff --git a/tests/progs/slapd-addel.c b/tests/progs/slapd-addel.c index 881fb1d17a..c96cdccd35 100644 --- a/tests/progs/slapd-addel.c +++ b/tests/progs/slapd-addel.c @@ -1,8 +1,22 @@ /* $OpenLDAP$ */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 1999-2005 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ +/* ACKNOWLEDGEMENTS: + * This work was initially developed by Kurt Spanier for inclusion + * in OpenLDAP Software. + */ + #include "portable.h" #include @@ -16,16 +30,18 @@ #include #include +#define LDAP_DEPRECATED 1 #include #define LOOPS 100 +#define RETRIES 0 static char * get_add_entry( char *filename, LDAPMod ***mods ); static void -do_addel( char *host, int port, char *manager, char *passwd, - char *dn, LDAPMod **attrs, int maxloop ); +do_addel( char *uri, char *host, int port, char *manager, char *passwd, + char *dn, LDAPMod **attrs, int maxloop, int maxretries ); static void usage( char *name ) @@ -39,48 +55,58 @@ int main( int argc, char **argv ) { int i; - char *host = "localhost"; - int port = -1; + char *host = "localhost"; + char *uri = NULL; + int port = -1; char *manager = NULL; char *passwd = NULL; char *filename = NULL; char *entry = NULL; - int loops = LOOPS; - LDAPMod **attrs = NULL; + int loops = LOOPS; + int retries = RETRIES; + LDAPMod **attrs = NULL; - while ( (i = getopt( argc, argv, "h:p:D:w:f:l:" )) != EOF ) { + while ( (i = getopt( argc, argv, "H:h:p:D:w:f:l:r:" )) != EOF ) { switch( i ) { - case 'h': /* the servers host */ - host = strdup( optarg ); + case 'H': /* the server's URI */ + uri = strdup( optarg ); break; - case 'p': /* the servers port */ - port = atoi( optarg ); - break; + case 'h': /* the servers host */ + host = strdup( optarg ); + break; - case 'D': /* the servers manager */ - manager = strdup( optarg ); + case 'p': /* the servers port */ + port = atoi( optarg ); break; - case 'w': /* the server managers password */ - passwd = strdup( optarg ); + case 'D': /* the servers manager */ + manager = strdup( optarg ); break; - case 'f': /* file with entry search request */ - filename = strdup( optarg ); - break; + case 'w': /* the server managers password */ + passwd = strdup( optarg ); + break; - case 'l': /* the number of loops */ - loops = atoi( optarg ); - break; + case 'f': /* file with entry search request */ + filename = strdup( optarg ); + break; - default: - usage( argv[0] ); - break; + case 'l': /* the number of loops */ + loops = atoi( optarg ); + break; + + case 'r': + retries = atoi( optarg ); + break; + + default: + usage( argv[0] ); + break; } } - if (( filename == NULL ) || ( port == -1 ) || + if (( filename == NULL ) || ( port == -1 && uri == NULL ) || ( manager == NULL ) || ( passwd == NULL )) usage( argv[0] ); @@ -101,7 +127,8 @@ main( int argc, char **argv ) } - do_addel( host, port, manager, passwd, entry, attrs, loops ); + do_addel( uri, host, port, manager, passwd, entry, attrs, + loops, retries ); exit( EXIT_SUCCESS ); } @@ -223,20 +250,29 @@ get_add_entry( char *filename, LDAPMod ***mods ) static void do_addel( + char *uri, char *host, int port, char *manager, char *passwd, char *entry, LDAPMod **attrs, - int maxloop + int maxloop, + int maxretries ) { - LDAP *ld; - int i; + LDAP *ld = NULL; + int i = 0, do_retry = maxretries; pid_t pid = getpid(); + int rc = LDAP_SUCCESS; - if (( ld = ldap_init( host, port )) == NULL ) { +retry:; + if ( uri ) { + ldap_initialize( &ld, uri ); + } else { + ld = ldap_init( host, port ); + } + if ( ld == NULL ) { perror( "ldap_init" ); exit( EXIT_FAILURE ); } @@ -247,40 +283,54 @@ do_addel( &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 - Add/Delete(%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" ); + if ( rc == LDAP_BUSY && do_retry > 0 ) { + do_retry--; + goto retry; + } + exit( EXIT_FAILURE ); + } - fprintf( stderr, "PID=%ld - Add/Delete(%d): entry=\"%s\".\n", - (long) pid, maxloop, entry ); - - for ( i = 0; i < maxloop; i++ ) { + for ( ; i < maxloop; i++ ) { /* add the entry */ - if ( ldap_add_s( ld, entry, attrs ) != LDAP_SUCCESS ) { - + rc = ldap_add_s( ld, entry, attrs ); + if ( rc != LDAP_SUCCESS ) { ldap_perror( ld, "ldap_add" ); + if ( rc == LDAP_BUSY && do_retry > 0 ) { + do_retry--; + goto retry; + } break; } +#if 0 /* wait a second for the add to really complete */ + /* This masks some race conditions though. */ sleep( 1 ); +#endif /* now delete the entry again */ - if ( ldap_delete_s( ld, entry ) != LDAP_SUCCESS ) { - + rc = ldap_delete_s( ld, entry ); + if ( rc != LDAP_SUCCESS ) { ldap_perror( ld, "ldap_delete" ); + if ( rc == LDAP_BUSY && do_retry > 0 ) { + do_retry--; + goto retry; + } break; - } - } - fprintf( stderr, " PID=%ld - Add/Delete done.\n", (long) pid ); + fprintf( stderr, " PID=%ld - Add/Delete done (%d).\n", (long) pid, rc ); ldap_unbind( ld ); }