]> git.sur5r.net Git - openldap/commitdiff
Added new test slapd-modrdn - string-reverses the RDN of the given DNs,
authorHoward Chu <hyc@openldap.org>
Sat, 22 Feb 2003 12:01:59 +0000 (12:01 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 22 Feb 2003 12:01:59 +0000 (12:01 +0000)
then undoes the change.

tests/progs/Makefile.in
tests/progs/slapd-modrdn.c [new file with mode: 0644]
tests/progs/slapd-tester.c

index c892a0a20d78bb58cc123d649cda73fb176589ea..cb215bb7ce6daa21309037ad46e5b877819c42ca 100644 (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)
 
diff --git a/tests/progs/slapd-modrdn.c b/tests/progs/slapd-modrdn.c
new file mode 100644 (file)
index 0000000..8de0b55
--- /dev/null
@@ -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 );
+}
+
+
index f14c92ea0bdfb545e4f6fd99bed1c189e84395dd..a2a96f415a12419af3a760778030d6a95a7b8acb 100644 (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];