Added new test slapd-modrdn - string-reverses the RDN of the given DNs,

then undoes the change.
This commit is contained in:
Howard Chu 2003-02-22 12:01:59 +00:00
parent 747265419d
commit 858917d2ef
3 changed files with 229 additions and 3 deletions

View file

@ -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)

173
tests/progs/slapd-modrdn.c Normal file
View file

@ -0,0 +1,173 @@
/* $OpenLDAP$ */
/*
* Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
#include "portable.h"
#include <stdio.h>
#include <ac/stdlib.h>
#include <ac/ctype.h>
#include <ac/param.h>
#include <ac/socket.h>
#include <ac/string.h>
#include <ac/unistd.h>
#include <ac/wait.h>
#include <ldap.h>
#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 <host>] -p port -D <managerDN> -w <passwd> -e <entry> [-l <loops>]\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 );
}

View file

@ -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];