X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=clients%2Ftools%2Fldapmodrdn.c;h=066ebfd6dc805436b5bddd50e55a4be1905341a3;hb=fb6590f8db1b3cec24e00a888e033ee427d4aaab;hp=b93490912092a27151a11877f3bf7efbc61e0dc9;hpb=0f5c87a41ca6c793df06adef223186bf605e0f6f;p=openldap diff --git a/clients/tools/ldapmodrdn.c b/clients/tools/ldapmodrdn.c index b934909120..066ebfd6dc 100644 --- a/clients/tools/ldapmodrdn.c +++ b/clients/tools/ldapmodrdn.c @@ -35,6 +35,7 @@ static char *prog = NULL; static char *binddn = NULL; static struct berval passwd = { 0, NULL }; +static char *ldapuri = NULL; static char *ldaphost = NULL; static int ldapport = 0; #ifdef HAVE_CYRUS_SASL @@ -47,7 +48,7 @@ static char *sasl_secprops = NULL; #endif static int use_tls = 0; static int not, verbose, contoper; -static LDAP *ld; +static LDAP *ld = NULL; static int domodrdn( LDAP *ld, @@ -76,6 +77,7 @@ usage( const char *s ) " -D binddn bind DN\n" " -f file read operations from `file'\n" " -h host LDAP server\n" +" -H URI LDAP Uniform Resource Indentifier(s)\n" " -I use SASL Interactive mode\n" " -k use Kerberos authentication\n" " -K like -k, but do only step 1 of the Kerberos bind\n" @@ -114,9 +116,9 @@ main(int argc, char **argv) authmethod = LDAP_AUTH_SIMPLE; version = -1; - prog = (prog = strrchr(argv[0], *LDAP_DIRSEP)) == NULL ? argv[0] : ++prog; + prog = (prog = strrchr(argv[0], *LDAP_DIRSEP)) == NULL ? argv[0] : prog + 1; - while (( i = getopt( argc, argv, "cf:rs:" "Cd:D:h:IkKMnO:p:P:QRU:vw:WxX:Y:Z" )) != EOF ) { + while (( i = getopt( argc, argv, "cf:rs:" "Cd:D:h:H:IkKMnO:p:P:QRU:vw:WxX:Y:Z" )) != EOF ) { switch( i ) { /* Modrdn Options */ case 'c': @@ -157,12 +159,31 @@ main(int argc, char **argv) binddn = strdup( optarg ); break; case 'h': /* ldap host */ + if( ldapuri != NULL ) { + fprintf( stderr, "%s: -h incompatible with -H\n" ); + return EXIT_FAILURE; + } if( ldaphost != NULL ) { fprintf( stderr, "%s: -h previously specified\n" ); return EXIT_FAILURE; } ldaphost = strdup( optarg ); break; + case 'H': /* ldap URI */ + if( ldaphost != NULL ) { + fprintf( stderr, "%s: -H incompatible with -h\n" ); + return EXIT_FAILURE; + } + if( ldapport ) { + fprintf( stderr, "%s: -H incompatible with -p\n" ); + return EXIT_FAILURE; + } + if( ldapuri != NULL ) { + fprintf( stderr, "%s: -H previously specified\n" ); + return EXIT_FAILURE; + } + ldapuri = strdup( optarg ); + break; case 'I': #ifdef HAVE_CYRUS_SASL if( version == LDAP_VERSION2 ) { @@ -515,10 +536,27 @@ main(int argc, char **argv) (void) SIGNAL( SIGPIPE, SIG_IGN ); #endif - if (( ld = ldap_init( ldaphost, ldapport )) == NULL ) { - perror( "ldap_init" ); - return( EXIT_FAILURE ); - } + if( ( ldaphost != NULL || ldapport ) && ( ldapuri == NULL ) ) { + if ( verbose ) { + fprintf( stderr, "ldap_init( %s, %d )\n", + ldaphost != NULL ? ldaphost : "", + ldapport ); + } + ld = ldap_init( ldaphost, ldapport ); + + } else { + if ( verbose ) { + fprintf( stderr, "ldap_initialize( %s )\n", + ldapuri != NULL ? ldapuri : "" ); + } + (void) ldap_initialize( &ld, ldapuri ); + } + + if( ld == NULL ) { + fprintf( stderr, "Could not create LDAP session handle (%d): %s\n", + rc, ldap_err2string(rc) ); + return EXIT_FAILURE; + } /* referrals */ if( ldap_set_option( ld, LDAP_OPT_REFERRALS, @@ -607,7 +645,7 @@ main(int argc, char **argv) c.ldctl_value.bv_len = 0; c.ldctl_iscritical = manageDSAit > 1; - err = ldap_set_option( ld, LDAP_OPT_SERVER_CONTROLS, &ctrls ); + err = ldap_set_option( ld, LDAP_OPT_SERVER_CONTROLS, ctrls ); if( err != LDAP_OPT_SUCCESS ) { fprintf( stderr, "Could not set ManageDSAit %scontrol\n",