X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=clients%2Ftools%2Fldapsearch.c;h=9b349da6b09289d11aa0943742b4933ee13b62f7;hb=78f6d75586381f3cfa0af8a7e3e72e862a76a730;hp=9c4c434cdd7f7718c349d25c6303d1eaf09cb539;hpb=fc6c7fefccd08b35f2f2c2a9ce956db0daeb7a25;p=openldap diff --git a/clients/tools/ldapsearch.c b/clients/tools/ldapsearch.c index 9c4c434cdd..9b349da6b0 100644 --- a/clients/tools/ldapsearch.c +++ b/clients/tools/ldapsearch.c @@ -145,6 +145,7 @@ static char *binddn = NULL; static struct berval passwd = { 0, NULL }; static char *base = NULL; static char *ldaphost = NULL; +static char *ldapuri = NULL; static int ldapport = 0; #ifdef HAVE_CYRUS_SASL static unsigned sasl_flags = LDAP_SASL_AUTOMATIC; @@ -166,7 +167,7 @@ main( int argc, char **argv ) int rc, i, first, scope, deref, attrsonly, manageDSAit; int referrals, timelimit, sizelimit, debug; int authmethod, version, want_bindpw; - LDAP *ld; + LDAP *ld = NULL; infile = NULL; debug = verbose = not = vals2tmp = referrals = @@ -177,10 +178,10 @@ main( int argc, char **argv ) scope = LDAP_SCOPE_SUBTREE; authmethod = -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, - "Aa:b:f:Ll:S:s:T:tuV:z:" "Cd:D:h:IkKMnO:p:P:QRU:vw:WxX:Y:Z")) != EOF ) + "Aa:b:f:Ll:S:s:T:tuV:z:" "Cd:D:h:H:IkKMnO:p:P:QRU:vw:WxX:Y:Z")) != EOF ) { switch( i ) { /* Search Options */ @@ -265,12 +266,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 ) { @@ -642,15 +662,26 @@ main( int argc, char **argv ) (void) SIGNAL( SIGPIPE, SIG_IGN ); #endif - if ( verbose ) { - fprintf( stderr, - (ldapport ? "ldap_init( %s, %d )\n" : "ldap_init( %s, )\n"), - (ldaphost != NULL) ? ldaphost : "", - ldapport ); + + 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 = ldap_init( ldaphost, ldapport )) == NULL ) { - perror( "ldap_init" ); + if( ld == NULL ) { + fprintf( stderr, "Could not create LDAP session handle (%d): %s\n", + rc, ldap_err2string(rc) ); return EXIT_FAILURE; } @@ -694,9 +725,13 @@ main( int argc, char **argv ) return EXIT_FAILURE; } - if ( use_tls && ldap_start_tls_s( ld, NULL, NULL ) != LDAP_SUCCESS ) { - if ( use_tls > 1 ) { + if ( use_tls ) { + rc = ldap_start_tls_s( ld, NULL, NULL ); + + if ( rc != LDAP_SUCCESS && use_tls > 1 ) { ldap_perror( ld, "ldap_start_tls" ); + fprintf( stderr, "Could not start TLS %d: %s\n", + rc, ldap_err2string( rc ) ); return EXIT_FAILURE; } fprintf( stderr, "WARNING: could not start TLS\n" ); @@ -763,7 +798,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",