X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=clients%2Ftools%2Fldappasswd.c;h=9a6cb8838a5ef16903122385c803cf656b051269;hb=fb6590f8db1b3cec24e00a888e033ee427d4aaab;hp=578463598c4601e2e66d934ef02756a7c40fc996;hpb=45ef1d2c905a52265a9a9aaca9b6feafb6be4801;p=openldap diff --git a/clients/tools/ldappasswd.c b/clients/tools/ldappasswd.c index 578463598c..9a6cb8838a 100644 --- a/clients/tools/ldappasswd.c +++ b/clients/tools/ldappasswd.c @@ -41,7 +41,8 @@ usage(const char *s) " -d level set LDAP debugging level to `level'\n" " -D binddn bind DN\n" " -f file read operations from `file'\n" -" -h host LDAP server\n" +" -h host LDAP server(s)\n" +" -H URI LDAP Uniform Resource Indentifier(s)\n" " -I use SASL Interactive mode\n" " -n show what would be done but don't actually search\n" " -O props SASL security properties\n" @@ -67,6 +68,7 @@ main( int argc, char *argv[] ) int rc; char *prog = NULL; char *ldaphost = NULL; + char *ldapuri = NULL; char *dn = NULL; char *binddn = NULL; @@ -96,7 +98,7 @@ main( int argc, char *argv[] ) #endif int use_tls = 0; int referrals = 0; - LDAP *ld; + LDAP *ld = NULL; struct berval *bv = NULL; int id, code; @@ -111,7 +113,7 @@ main( int argc, char *argv[] ) usage (argv[0]); while( (i = getopt( argc, argv, - "Aa:Ss:" "Cd:D:h:InO:p:QRU:vw:WxX:Y:Z" )) != EOF ) + "Aa:Ss:" "Cd:D:h:H:InO:p:QRU:vw:WxX:Y:Z" )) != EOF ) { switch (i) { /* Password Options */ @@ -161,12 +163,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 ) { @@ -542,8 +563,25 @@ main( int argc, char *argv[] ) #endif /* connect to server */ - if ((ld = ldap_init( ldaphost, ldapport )) == NULL) { - perror("ldap_init"); + 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; }