From 858917d2ef257da1486a5d5669d6226e88cd8bb7 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sat, 22 Feb 2003 12:01:59 +0000 Subject: [PATCH] Added new test slapd-modrdn - string-reverses the RDN of the given DNs, then undoes the change. --- tests/progs/Makefile.in | 7 +- tests/progs/slapd-modrdn.c | 173 +++++++++++++++++++++++++++++++++++++ tests/progs/slapd-tester.c | 52 ++++++++++- 3 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 tests/progs/slapd-modrdn.c diff --git a/tests/progs/Makefile.in b/tests/progs/Makefile.in index c892a0a20d..cb215bb7ce 100644 --- a/tests/progs/Makefile.in +++ b/tests/progs/Makefile.in @@ -4,9 +4,10 @@ ## ## tests Makefile.in for OpenLDAP -PROGRAMS = slapd-tester slapd-search slapd-read slapd-addel +PROGRAMS = slapd-tester slapd-search slapd-read slapd-addel slapd-modrdn -SRCS = slapd-tester.c slapd-search.c slapd-read.c slapd-addel.c +SRCS = slapd-tester.c slapd-search.c slapd-read.c slapd-addel.c \ + slapd-modrdn.c LDAP_INCDIR= ../../include LDAP_LIBDIR= ../../libraries @@ -31,4 +32,6 @@ slapd-read: slapd-read.o $(XLIBS) slapd-addel: slapd-addel.o $(XLIBS) $(LTLINK) -o $@ slapd-addel.o $(LIBS) +slapd-modrdn: slapd-modrdn.o $(XLIBS) + $(LTLINK) -o $@ slapd-modrdn.o $(LIBS) diff --git a/tests/progs/slapd-modrdn.c b/tests/progs/slapd-modrdn.c new file mode 100644 index 0000000000..8de0b554b1 --- /dev/null +++ b/tests/progs/slapd-modrdn.c @@ -0,0 +1,173 @@ +/* $OpenLDAP$ */ +/* + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ +#include "portable.h" + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#define LOOPS 100 + +static void +do_modrdn( char *uri, char *host, int port, char *manager, char *passwd, char *entry, int maxloop ); + +static void +usage( char *name ) +{ + fprintf( stderr, "usage: %s [-h ] -p port -D -w -e [-l ]\n", + name ); + exit( EXIT_FAILURE ); +} + +int +main( int argc, char **argv ) +{ + int i; + char *uri = NULL; + char *host = "localhost"; + int port = -1; + char *manager = NULL; + char *passwd = NULL; + char *entry = NULL; + int loops = LOOPS; + + while ( (i = getopt( argc, argv, "H:h:p:D:w:e:l:" )) != EOF ) { + switch( i ) { + case 'H': /* the server uri */ + uri = strdup( optarg ); + break; + case 'h': /* the servers host */ + host = strdup( optarg ); + break; + + case 'p': /* the servers port */ + port = atoi( optarg ); + break; + case 'D': /* the servers manager */ + manager = strdup( optarg ); + break; + + 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; + + default: + usage( argv[0] ); + break; + } + } + + if (( entry == NULL ) || ( port == -1 && uri == NULL )) + usage( argv[0] ); + + if ( *entry == '\0' ) { + + fprintf( stderr, "%s: invalid EMPTY entry DN.\n", + argv[0] ); + exit( EXIT_FAILURE ); + + } + + do_modrdn( uri, host, port, manager, passwd, entry, loops ); + exit( EXIT_SUCCESS ); +} + + +static void +do_modrdn( char *uri, char *host, int port, char *manager, char *passwd, char *entry, int maxloop ) +{ + LDAP *ld = NULL; + int i; + pid_t pid = getpid(); + char *DNs[2] = { entry, NULL }; + char *rdns[2]; + + DNs[1] = strdup( entry ); + + /* reverse the RDN, make new DN */ + { + char *p1, *p2; + + p1 = strchr( entry, '=' ) + 1; + p2 = strchr( p1, ',' ); + + *p2 = '\0'; + rdns[1] = strdup( entry ); + *p2-- = ','; + + for (i = p1 - entry;p2 >= p1;) + DNs[1][i++] = *p2--; + + DNs[1][i] = '\0'; + rdns[0] = strdup( DNs[1] ); + DNs[1][i] = ','; + } + + if ( uri ) { + ldap_initialize( &ld, uri ); + } else { + ld = ldap_init( host, port ); + } + if ( ld == NULL ) { + perror( "ldap_init" ); + exit( EXIT_FAILURE ); + } + + { + int version = LDAP_VERSION3; + (void) ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, + &version ); + } + + if ( ldap_bind_s( ld, manager, passwd, LDAP_AUTH_SIMPLE ) != LDAP_SUCCESS ) { + ldap_perror( ld, "ldap_bind" ); + 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 ) { + ldap_perror( ld, "ldap_modrdn" ); + if ( rc != LDAP_NO_SUCH_OBJECT ) break; + continue; + } + if (( rc = ldap_modrdn2_s( ld, DNs[1], rdns[1], 1 )) + != LDAP_SUCCESS ) { + ldap_perror( ld, "ldap_modrdn" ); + if ( rc != LDAP_NO_SUCH_OBJECT ) break; + continue; + } + + } + + fprintf( stderr, " PID=%ld - Modrdn done.\n", (long) pid ); + + ldap_unbind( ld ); +} + + diff --git a/tests/progs/slapd-tester.c b/tests/progs/slapd-tester.c index f14c92ea0b..a2a96f415a 100644 --- a/tests/progs/slapd-tester.c +++ b/tests/progs/slapd-tester.c @@ -24,6 +24,7 @@ #define SEARCHCMD "slapd-search" #define READCMD "slapd-read" #define ADDCMD "slapd-addel" +#define MODRDNCMD "slapd-modrdn" #define MAXARGS 100 #define MAXREQS 20 #define LOOPS "100" @@ -31,6 +32,7 @@ #define TSEARCHFILE "do_search.0" #define TREADFILE "do_read.0" #define TADDFILE "do_add." +#define TMODRDNFILE "do_modrdn.0" static char *get_file_name( char *dirname, char *filename ); static int get_search_filters( char *filename, char *filters[] ); @@ -79,6 +81,9 @@ main( int argc, char **argv ) int rnum = 0; char *afiles[MAXREQS]; int anum = 0; + char *mfile = NULL; + char *mreqs[MAXREQS]; + int mnum = 0; char *sargs[MAXARGS]; int sanum; char scmd[MAXPATHLEN]; @@ -88,6 +93,9 @@ main( int argc, char **argv ) char *aargs[MAXARGS]; int aanum; char acmd[MAXPATHLEN]; + char *margs[MAXARGS]; + int manum; + char mcmd[MAXPATHLEN]; while ( (i = getopt( argc, argv, "H:h:p:D:w:b:d:j:l:P:" )) != EOF ) { switch( i ) { @@ -153,7 +161,7 @@ main( int argc, char **argv ) } - /* look for search, read, and add/delete files */ + /* look for search, read, modrdn, and add/delete files */ for ( file = readdir( datadir ); file; file = readdir( datadir )) { if ( !strcasecmp( file->d_name, TSEARCHFILE )) { @@ -162,6 +170,9 @@ main( int argc, char **argv ) } else if ( !strcasecmp( file->d_name, TREADFILE )) { rfile = get_file_name( dirname, file->d_name ); continue; + } else if ( !strcasecmp( file->d_name, TMODRDNFILE )) { + mfile = get_file_name( dirname, file->d_name ); + continue; } else if ( !strncasecmp( file->d_name, TADDFILE, strlen( TADDFILE )) && ( anum < MAXREQS )) { afiles[anum++] = get_file_name( dirname, file->d_name ); @@ -181,6 +192,11 @@ main( int argc, char **argv ) rnum = get_read_entries( rfile, rreqs ); } + /* look for modrdn requests */ + if ( mfile ) { + mnum = get_read_entries( mfile, mreqs ); + } + /* * generate the search clients */ @@ -229,6 +245,33 @@ main( int argc, char **argv ) rargs[ranum++] = NULL; /* will hold the read entry */ rargs[ranum++] = NULL; + /* + * generate the modrdn clients + */ + + manum = 0; + snprintf( mcmd, sizeof mcmd, "%s" LDAP_DIRSEP MODRDNCMD, + progdir ); + margs[manum++] = mcmd; + if ( uri ) { + margs[manum++] = "-H"; + margs[manum++] = uri; + } else { + margs[manum++] = "-h"; + margs[manum++] = host; + margs[manum++] = "-p"; + margs[manum++] = port; + } + margs[manum++] = "-D"; + margs[manum++] = manager; + margs[manum++] = "-w"; + margs[manum++] = passwd; + margs[manum++] = "-l"; + margs[manum++] = loops; + margs[manum++] = "-e"; + margs[manum++] = NULL; /* will hold the modrdn entry */ + margs[manum++] = NULL; + /* * generate the add/delete clients */ @@ -272,6 +315,13 @@ main( int argc, char **argv ) } + if ( j < mnum ) { + + margs[manum - 2] = mreqs[j]; + fork_child( mcmd, margs ); + + } + if ( j < anum ) { aargs[aanum - 2] = afiles[j]; -- 2.39.5