X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=clients%2Ftools%2Fldapmodrdn.c;h=bcd9d1bf3552463609486acc8f66c4ab174fcaf9;hb=3277a27b1019073130dd7c4f0f6c0369c247e9d6;hp=69d99e7f5a469a9f58a2b34ee677427a86148b3c;hpb=42e0d83cb3a1a1c5b25183f1ab74ce7edbe25de7;p=openldap diff --git a/clients/tools/ldapmodrdn.c b/clients/tools/ldapmodrdn.c index 69d99e7f5a..bcd9d1bf35 100644 --- a/clients/tools/ldapmodrdn.c +++ b/clients/tools/ldapmodrdn.c @@ -1,55 +1,79 @@ -/* ldapmodrdn.c - generic program to modify an entry's RDN using LDAP */ +/* ldapmodrdn.c - generic program to modify an entry's RDN using LDAP. + * + * Support for MODIFYDN REQUEST V3 (newSuperior) by: + * + * Copyright 1999, Juan C. Gomez, All rights reserved. + * This software is not subject to any license of Silicon Graphics + * Inc. or Purdue University. + * + * Redistribution and use in source and binary forms are permitted + * without restriction or fee of any kind as long as this notice + * is preserved. + * + */ + +#include "portable.h" #include -#include #include -#include + +#include +#include +#include +#include + #include #include -#include "ldapconfig.h" - -static char *binddn = LDAPMODRDN_BINDDN; -static char *base = LDAPMODRDN_BASE; +static char *binddn = NULL; static char *passwd = NULL; -static char *ldaphost = LDAPHOST; -static int ldapport = LDAP_PORT; +static char *base = NULL; +static char *ldaphost = NULL; +static int ldapport = 0; static int not, verbose, contoper; static LDAP *ld; -#ifdef LDAP_DEBUG -extern int ldap_debug, lber_debug; -#endif /* LDAP_DEBUG */ - #define safe_realloc( ptr, size ) ( ptr == NULL ? malloc( size ) : \ realloc( ptr, size )) +static int domodrdn LDAP_P(( + LDAP *ld, + char *dn, + char *rdn, + int remove, /* flag: remove old RDN */ + char *newSuperior)); -main( argc, argv ) - int argc; - char **argv; +int +main(int argc, char **argv) { - char *usage = "usage: %s [-nvkc] [-d debug-level] [-h ldaphost] [-p ldapport] [-D binddn] [-w passwd] [ -f file | < entryfile | dn newrdn ]\n"; - char *myname,*infile, *p, *entrydn, *rdn, buf[ 4096 ]; + char *usage = "usage: %s [-nvkWc] [-d debug-level] [-h ldaphost] [-P version] [-p ldapport] [-D binddn] [-w passwd] [ -f file | < entryfile | dn newrdn ] [-s newSuperior]\n"; + char *myname,*infile, *entrydn, *rdn, buf[ 4096 ]; FILE *fp; - int rc, i, kerberos, remove, havedn, authmethod; - LDAPMod **pmods; - - extern char *optarg; - extern int optind; + int rc, i, remove, havedn, authmethod, version, want_bindpw, debug; + char *newSuperior=NULL; infile = NULL; - kerberos = not = contoper = verbose = remove = 0; + not = contoper = verbose = remove = want_bindpw = debug = 0; + authmethod = LDAP_AUTH_SIMPLE; + version = -1; myname = (myname = strrchr(argv[0], '/')) == NULL ? argv[0] : ++myname; - while (( i = getopt( argc, argv, "kKcnvrh:p:D:w:d:f:" )) != EOF ) { + while (( i = getopt( argc, argv, "WkKcnvrh:P:p:D:w:d:f:s:" )) != EOF ) { switch( i ) { case 'k': /* kerberos bind */ - kerberos = 2; +#ifdef HAVE_KERBEROS + authmethod = LDAP_AUTH_KRBV4; +#else + fprintf (stderr, "%s was not compiled with Kerberos support\n", argv[0]); +#endif break; case 'K': /* kerberos bind, part one only */ - kerberos = 1; +#ifdef HAVE_KERBEROS + authmethod = LDAP_AUTH_KRBV41; +#else + fprintf (stderr, "%s was not compiled with Kerberos support\n", argv[0]); +#endif break; case 'c': /* continuous operation mode */ ++contoper; @@ -60,15 +84,15 @@ main( argc, argv ) case 'D': /* bind DN */ binddn = strdup( optarg ); break; + case 's': /* newSuperior */ + newSuperior = strdup( optarg ); + version = LDAP_VERSION3; /* This option => force V3 */ + break; case 'w': /* password */ passwd = strdup( optarg ); break; case 'd': -#ifdef LDAP_DEBUG - ldap_debug = lber_debug = atoi( optarg ); /* */ -#else /* LDAP_DEBUG */ - fprintf( stderr, "compile with -DLDAP_DEBUG for debugging\n" ); -#endif /* LDAP_DEBUG */ + debug |= atoi( optarg ); break; case 'f': /* read from file */ infile = strdup( optarg ); @@ -85,12 +109,35 @@ main( argc, argv ) case 'r': /* remove old RDN */ remove++; break; + case 'W': + want_bindpw++; + break; + case 'P': + switch(optarg[0]) + { + case '2': + version = LDAP_VERSION2; + break; + case '3': + version = LDAP_VERSION3; + break; + } + break; default: fprintf( stderr, usage, argv[0] ); exit( 1 ); } } + if ((newSuperior != NULL) && (version != LDAP_VERSION3)) + { + fprintf( stderr,\ + "%s: version conflict!, -s newSuperior requires LDAP v3\n",\ + myname); + fprintf( stderr, usage, argv[0] ); + exit( 1 ); + } + havedn = 0; if (argc - optind == 2) { if (( rdn = strdup( argv[argc - 1] )) == NULL ) { @@ -117,20 +164,33 @@ main( argc, argv ) fp = stdin; } - if (( ld = ldap_open( ldaphost, ldapport )) == NULL ) { - perror( "ldap_open" ); + if ( debug ) { + lber_set_option( NULL, LBER_OPT_DEBUG_LEVEL, &debug ); + ldap_set_option( NULL, LDAP_OPT_DEBUG_LEVEL, &debug ); + } + +#ifdef SIGPIPE + (void) SIGNAL( SIGPIPE, SIG_IGN ); +#endif + + if (( ld = ldap_init( ldaphost, ldapport )) == NULL ) { + perror( "ldap_init" ); exit( 1 ); } - ld->ld_deref = LDAP_DEREF_NEVER; /* this seems prudent */ + /* this seems prudent */ + { + int deref = LDAP_DEREF_NEVER; + ldap_set_option( ld, LDAP_OPT_DEREF, &deref); + } + + if (want_bindpw) + passwd = getpass("Enter LDAP Password: "); + + if( version != -1) { + ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version ); + } - if ( !kerberos ) { - authmethod = LDAP_AUTH_SIMPLE; - } else if ( kerberos == 1 ) { - authmethod = LDAP_AUTH_KRBV41; - } else { - authmethod = LDAP_AUTH_KRBV4; - } if ( ldap_bind_s( ld, binddn, passwd, authmethod ) != LDAP_SUCCESS ) { ldap_perror( ld, "ldap_bind" ); exit( 1 ); @@ -138,7 +198,7 @@ main( argc, argv ) rc = 0; if (havedn) - rc = domodrdn(ld, entrydn, rdn, remove); + rc = domodrdn(ld, entrydn, rdn, remove, newSuperior); else while ((rc == 0 || contoper) && fgets(buf, sizeof(buf), fp) != NULL) { if ( *buf != '\0' ) { /* blank lines optional, skip */ buf[ strlen( buf ) - 1 ] = '\0'; /* remove nl */ @@ -148,7 +208,7 @@ main( argc, argv ) perror( "strdup" ); exit( 1 ); } - rc = domodrdn(ld, entrydn, rdn, remove); + rc = domodrdn(ld, entrydn, rdn, remove, newSuperior); havedn = 0; } else if ( !havedn ) { /* don't have DN yet */ if (( entrydn = strdup( buf )) == NULL ) { @@ -163,13 +223,17 @@ main( argc, argv ) ldap_unbind( ld ); exit( rc ); + + /* UNREACHABLE */ + return(0); } -domodrdn( ld, dn, rdn, remove ) - LDAP *ld; - char *dn; - char *rdn; - int remove; /* flag: remove old RDN */ +static int domodrdn( + LDAP *ld, + char *dn, + char *rdn, + int remove, /* flag: remove old RDN */ + char *newSuperior) { int i; @@ -179,12 +243,14 @@ domodrdn( ld, dn, rdn, remove ) printf("removing old RDN\n"); else printf("keeping old RDN\n"); + if(newSuperior!=NULL) + printf("placing node under a new parent = %s\n", newSuperior); } if ( !not ) { - i = ldap_modrdn2_s( ld, dn, rdn, remove ); + i = ldap_rename2_s( ld, dn, rdn, remove, newSuperior ); if ( i != LDAP_SUCCESS ) { - ldap_perror( ld, "ldap_modrdn2_s" ); + ldap_perror( ld, "ldap_rename2_s" ); } else if ( verbose ) { printf( "modrdn complete\n" ); }