]> git.sur5r.net Git - openldap/blobdiff - clients/tools/ldapsearch.c
Fix URI
[openldap] / clients / tools / ldapsearch.c
index 2365cdd8df447e867cbdc0f2967c3a3b4096940c..9b349da6b09289d11aa0943742b4933ee13b62f7 100644 (file)
@@ -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 ) {
@@ -583,7 +603,8 @@ main( int argc, char **argv )
        }
 
        if (( argc - optind < 1 ) ||
-               ( strchr( argv[optind], '=' ) == NULL ) )
+               ( *argv[optind] != '(' /*')'*/ &&
+               ( strchr( argv[optind], '=' ) == NULL ) ) )
        {
                filtpattern = "(objectclass=*)";
        } else {
@@ -641,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, <DEFAULT> )\n"),
-                       (ldaphost != NULL) ? ldaphost : "<DEFAULT>",
-                       ldapport );
+
+       if( ( ldaphost != NULL || ldapport ) && ( ldapuri == NULL ) ) {
+               if ( verbose ) {
+                       fprintf( stderr, "ldap_init( %s, %d )\n",
+                               ldaphost != NULL ? ldaphost : "<DEFAULT>",
+                               ldapport );
+               }
+               ld = ldap_init( ldaphost, ldapport );
+
+       } else {
+               if ( verbose ) {
+                       fprintf( stderr, "ldap_initialize( %s )\n",
+                               ldapuri != NULL ? ldapuri : "<DEFAULT>" );
+               }
+               (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;
        }
 
@@ -693,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" );
@@ -762,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",