From e97cdfb7a9d13d619f97a62d9070bb4cfb17f64a Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Fri, 25 Aug 2000 05:31:29 +0000 Subject: [PATCH] Add support of "-H uri" --- clients/tools/ldapdelete.c | 48 +++++++++++++++++++++++++++++++++----- clients/tools/ldapmodify.c | 46 ++++++++++++++++++++++++++++++++---- clients/tools/ldapmodrdn.c | 48 +++++++++++++++++++++++++++++++++----- clients/tools/ldappasswd.c | 47 +++++++++++++++++++++++++++++++++---- clients/tools/ldapsearch.c | 48 +++++++++++++++++++++++++++++++------- 5 files changed, 206 insertions(+), 31 deletions(-) diff --git a/clients/tools/ldapdelete.c b/clients/tools/ldapdelete.c index f512bd3b1f..bb2d127863 100644 --- a/clients/tools/ldapdelete.c +++ b/clients/tools/ldapdelete.c @@ -23,6 +23,7 @@ static char *prog; static char *binddn = NULL; static struct berval passwd = { 0, NULL }; +static char *ldapuri = NULL; static char *ldaphost = NULL; static int ldapport = 0; static int prune = 0; @@ -36,7 +37,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 dodelete LDAP_P(( LDAP *ld, @@ -100,7 +101,7 @@ main( int argc, char **argv ) prog = (prog = strrchr(argv[0], *LDAP_DIRSEP)) == NULL ? argv[0] : prog + 1; - while (( i = getopt( argc, argv, "cf:r" "Cd:D:h:IkKMnO:p:P:QRU:vw:WxX:Y:Z" )) != EOF ) { + while (( i = getopt( argc, argv, "cf:r" "Cd:D:h:H:IkKMnO:p:P:QRU:vw:WxX:Y:Z" )) != EOF ) { switch( i ) { /* Delete Specific Options */ case 'c': /* continuous operation mode */ @@ -135,12 +136,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 ) { @@ -472,10 +492,26 @@ 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 ); + return EXIT_FAILURE; + } { /* this seems prudent for searches below */ diff --git a/clients/tools/ldapmodify.c b/clients/tools/ldapmodify.c index b8245cce2d..ed89f35270 100644 --- a/clients/tools/ldapmodify.c +++ b/clients/tools/ldapmodify.c @@ -36,6 +36,7 @@ static char *prog; 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 @@ -48,7 +49,7 @@ static char *sasl_secprops = NULL; #endif static int use_tls = 0; static int ldapadd, replace, not, verbose, contoper, force; -static LDAP *ld; +static LDAP *ld = NULL; #define LDAPMOD_MAXLINE 4096 @@ -157,7 +158,7 @@ main( int argc, char **argv ) authmethod = -1; version = -1; - while (( i = getopt( argc, argv, "acrf:F" "Cd:D:h:IkKMnO:p:P:QRU:vw:WxX:Y:Z" )) != EOF ) { + while (( i = getopt( argc, argv, "acrf:F" "Cd:D:h:H:IkKMnO:p:P:QRU:vw:WxX:Y:Z" )) != EOF ) { switch( i ) { /* Modify Options */ case 'a': /* add */ @@ -195,12 +196,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 ) { @@ -539,9 +559,25 @@ main( int argc, char **argv ) #endif if ( !not ) { - 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 ); + return EXIT_FAILURE; } /* referrals */ diff --git a/clients/tools/ldapmodrdn.c b/clients/tools/ldapmodrdn.c index 6642dd5fc4..8782d1c077 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, @@ -116,7 +117,7 @@ main(int argc, char **argv) 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 +158,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 +535,26 @@ 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 ); + return EXIT_FAILURE; + } /* referrals */ if( ldap_set_option( ld, LDAP_OPT_REFERRALS, diff --git a/clients/tools/ldappasswd.c b/clients/tools/ldappasswd.c index 578463598c..6564b6161a 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,24 @@ 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 ); return EXIT_FAILURE; } diff --git a/clients/tools/ldapsearch.c b/clients/tools/ldapsearch.c index 7d1b27e3ac..f105ec0438 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 = @@ -180,7 +181,7 @@ main( int argc, char **argv ) 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,25 @@ 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 ); return EXIT_FAILURE; }