summaryrefslogtreecommitdiffstats
path: root/ldap/c-sdk/libraries/libldap/test.c
diff options
context:
space:
mode:
authorMatt A. Tobin <email@mattatobin.com>2019-11-03 13:17:15 -0500
committerMatt A. Tobin <email@mattatobin.com>2019-11-03 13:17:15 -0500
commit6513e41cb75e64384f35470d59ad6a4f88092e82 (patch)
tree969c588ab5703c74ece39a7da0be5faf3d868cef /ldap/c-sdk/libraries/libldap/test.c
parent2d4aca6d0036937afadfb93359d31fe3b4eabf84 (diff)
downloadUXP-6513e41cb75e64384f35470d59ad6a4f88092e82.tar
UXP-6513e41cb75e64384f35470d59ad6a4f88092e82.tar.gz
UXP-6513e41cb75e64384f35470d59ad6a4f88092e82.tar.lz
UXP-6513e41cb75e64384f35470d59ad6a4f88092e82.tar.xz
UXP-6513e41cb75e64384f35470d59ad6a4f88092e82.zip
Issue #1258 - Part 2: Use binoc-central version of ldap
Diffstat (limited to 'ldap/c-sdk/libraries/libldap/test.c')
-rw-r--r--ldap/c-sdk/libraries/libldap/test.c1898
1 files changed, 0 insertions, 1898 deletions
diff --git a/ldap/c-sdk/libraries/libldap/test.c b/ldap/c-sdk/libraries/libldap/test.c
deleted file mode 100644
index fa984f343..000000000
--- a/ldap/c-sdk/libraries/libldap/test.c
+++ /dev/null
@@ -1,1898 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code, released
- * March 31, 1998.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998-1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-/* test.c - a simple test harness. */
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-#ifdef MACOS
-#ifdef THINK_C
-#include <console.h>
-#include <unix.h>
-#include <fcntl.h>
-#endif /* THINK_C */
-#include "macos.h"
-#else /* MACOS */
-#if defined( DOS )
-#include "msdos.h"
-#if defined( WINSOCK )
-#include "console.h"
-#endif /* WINSOCK */
-#else /* DOS */
-#ifdef _WINDOWS
-#include <windows.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <stdlib.h>
-//#include "console.h"
-#else /* _WINDOWS */
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/file.h>
-#ifndef VMS
-#include <fcntl.h>
-#include <unistd.h>
-#endif /* VMS */
-#endif /* _WINDOWS */
-#endif /* DOS */
-#endif /* MACOS */
-
-#include "ldap.h"
-#include "disptmpl.h"
-#include "ldaplog.h"
-#include "portable.h"
-#ifndef NO_LIBLCACHE
-#include "lcache.h"
-#endif /* !NO_LIBLCACHE */
-
-#undef NET_SSL
-#if defined(NET_SSL)
-#include <nss.h>
-#include <ldap_ssl.h>
-#endif
-
-
-#if !defined( PCNFS ) && !defined( WINSOCK ) && !defined( MACOS )
-#define MOD_USE_BVALS
-#endif /* !PCNFS && !WINSOCK && !MACOS */
-
-static void handle_result( LDAP *ld, LDAPMessage *lm, int onlyone );
-static void print_ldap_result( LDAP *ld, LDAPMessage *lm, char *s );
-static void print_controls( LDAPControl **ctrls, int freeit );
-static void print_referrals( char **refs, int freeit );
-static void print_search_entry( LDAP *ld, LDAPMessage *res, int onlyone );
-static char *changetype_num2string( ber_int_t chgtype );
-static void print_search_reference( LDAP *ld, LDAPMessage *res, int onlyone );
-static void free_list( char **list );
-static int entry2textwrite( void *fp, char *buf, int len );
-static void bprint( char *data, int len );
-static char **string2words( char *str, char *delims );
-static const char * url_parse_err2string( int e );
-
-char *dnsuffix;
-
-#ifndef WINSOCK
-static char *
-getline( char *line, int len, FILE *fp, char *prompt )
-{
- printf(prompt);
-
- if ( fgets( line, len, fp ) == NULL )
- return( NULL );
-
- line[ strlen( line ) - 1 ] = '\0';
-
- return( line );
-}
-#endif /* WINSOCK */
-
-static char **
-get_list( char *prompt )
-{
- static char buf[256];
- int num;
- char **result;
-
- num = 0;
- result = (char **) 0;
- while ( 1 ) {
- getline( buf, sizeof(buf), stdin, prompt );
-
- if ( *buf == '\0' )
- break;
-
- if ( result == (char **) 0 )
- result = (char **) malloc( sizeof(char *) );
- else
- result = (char **) realloc( result,
- sizeof(char *) * (num + 1) );
-
- result[num++] = (char *) strdup( buf );
- }
- if ( result == (char **) 0 )
- return( NULL );
- result = (char **) realloc( result, sizeof(char *) * (num + 1) );
- result[num] = NULL;
-
- return( result );
-}
-
-
-static void
-free_list( char **list )
-{
- int i;
-
- if ( list != NULL ) {
- for ( i = 0; list[ i ] != NULL; ++i ) {
- free( list[ i ] );
- }
- free( (char *)list );
- }
-}
-
-
-#ifdef MOD_USE_BVALS
-static int
-file_read( char *path, struct berval *bv )
-{
- FILE *fp;
- long rlen;
- int eof;
-
- if (( fp = NSLDAPI_FOPEN( path, "r" )) == NULL ) {
- perror( path );
- return( -1 );
- }
-
- if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
- perror( path );
- fclose( fp );
- return( -1 );
- }
-
- bv->bv_len = ftell( fp );
-
- if (( bv->bv_val = (char *)malloc( bv->bv_len )) == NULL ) {
- perror( "malloc" );
- fclose( fp );
- return( -1 );
- }
-
- if ( fseek( fp, 0L, SEEK_SET ) != 0 ) {
- perror( path );
- fclose( fp );
- return( -1 );
- }
-
- rlen = fread( bv->bv_val, 1, bv->bv_len, fp );
- eof = feof( fp );
- fclose( fp );
-
- if ( (unsigned long)rlen != bv->bv_len ) {
- perror( path );
- free( bv->bv_val );
- return( -1 );
- }
-
- return( bv->bv_len );
-}
-#endif /* MOD_USE_BVALS */
-
-
-static LDAPMod **
-get_modlist( char *prompt1, char *prompt2, char *prompt3 )
-{
- static char buf[256];
- int num;
- LDAPMod tmp;
- LDAPMod **result;
-#ifdef MOD_USE_BVALS
- struct berval **bvals;
-#endif /* MOD_USE_BVALS */
-
- num = 0;
- result = NULL;
- while ( 1 ) {
- if ( prompt1 ) {
- getline( buf, sizeof(buf), stdin, prompt1 );
- tmp.mod_op = atoi( buf );
-
- if ( tmp.mod_op == -1 || buf[0] == '\0' )
- break;
- } else {
- tmp.mod_op = 0;
- }
-
- getline( buf, sizeof(buf), stdin, prompt2 );
- if ( buf[0] == '\0' )
- break;
- tmp.mod_type = strdup( buf );
-
- tmp.mod_values = get_list( prompt3 );
-#ifdef MOD_USE_BVALS
- if ( tmp.mod_values != NULL ) {
- int i;
-
- for ( i = 0; tmp.mod_values[i] != NULL; ++i )
- ;
- bvals = (struct berval **)calloc( i + 1,
- sizeof( struct berval *));
- for ( i = 0; tmp.mod_values[i] != NULL; ++i ) {
- bvals[i] = (struct berval *)malloc(
- sizeof( struct berval ));
- if ( strncmp( tmp.mod_values[i], "{FILE}",
- 6 ) == 0 ) {
- if ( file_read( tmp.mod_values[i] + 6,
- bvals[i] ) < 0 ) {
- return( NULL );
- }
- } else {
- bvals[i]->bv_val = tmp.mod_values[i];
- bvals[i]->bv_len =
- strlen( tmp.mod_values[i] );
- }
- }
- tmp.mod_bvalues = bvals;
- tmp.mod_op |= LDAP_MOD_BVALUES;
- }
-#endif /* MOD_USE_BVALS */
-
- if ( result == NULL )
- result = (LDAPMod **) malloc( sizeof(LDAPMod *) );
- else
- result = (LDAPMod **) realloc( result,
- sizeof(LDAPMod *) * (num + 1) );
-
- result[num] = (LDAPMod *) malloc( sizeof(LDAPMod) );
- *(result[num]) = tmp; /* struct copy */
- num++;
- }
- if ( result == NULL )
- return( NULL );
- result = (LDAPMod **) realloc( result, sizeof(LDAPMod *) * (num + 1) );
- result[num] = NULL;
-
- return( result );
-}
-
-
-int LDAP_CALL LDAP_CALLBACK
-bind_prompt( LDAP *ld, char **dnp, char **passwdp, int *authmethodp,
- int freeit, void *dummy )
-{
- static char dn[256], passwd[256];
-
- if ( !freeit ) {
-#ifdef KERBEROS
- getline( dn, sizeof(dn), stdin,
- "re-bind method (0->simple, 1->krbv41, 2->krbv42, 3->krbv41&2)? " );
- if (( *authmethodp = atoi( dn )) == 3 ) {
- *authmethodp = LDAP_AUTH_KRBV4;
- } else {
- *authmethodp |= 0x80;
- }
-#else /* KERBEROS */
- *authmethodp = LDAP_AUTH_SIMPLE;
-#endif /* KERBEROS */
-
- getline( dn, sizeof(dn), stdin, "re-bind dn? " );
- strcat( dn, dnsuffix );
- *dnp = dn;
-
- if ( *authmethodp == LDAP_AUTH_SIMPLE && dn[0] != '\0' ) {
- getline( passwd, sizeof(passwd), stdin,
- "re-bind password? " );
- } else {
- passwd[0] = '\0';
- }
- *passwdp = passwd;
- }
-
- return( LDAP_SUCCESS );
-}
-
-
-#define HEX2BIN( h ) ( (h) >= '0' && (h) <='9' ? (h) - '0' : (h) - 'A' + 10 )
-
-void
-berval_from_hex( struct berval *bvp, char *hexstr )
-{
- char *src, *dst, c;
- unsigned char abyte;
-
- dst = bvp->bv_val;
- bvp->bv_len = 0;
- src = hexstr;
- while ( *src != '\0' ) {
- c = *src;
- if ( isupper( c )) {
- c = tolower( c );
- }
- abyte = HEX2BIN( c ) << 4;
-
- ++src;
- c = *src;
- if ( isupper( c )) {
- c = tolower( c );
- }
- abyte |= HEX2BIN( c );
- ++src;
-
- *dst++ = abyte;
- ++bvp->bv_len;
- }
-}
-
-
-static void
-add_control( LDAPControl ***ctrlsp, LDAPControl *newctrl )
-{
- int i;
-
- if ( *ctrlsp == NULL ) {
- *ctrlsp = (LDAPControl **) calloc( 2, sizeof(LDAPControl *) );
- i = 0;
- } else {
- for ( i = 0; (*ctrlsp)[i] != NULL; i++ ) {
- ; /* NULL */
- }
- *ctrlsp = (LDAPControl **) realloc( *ctrlsp,
- (i + 2) * sizeof(LDAPControl *) );
- }
- (*ctrlsp)[i] = newctrl;
- (*ctrlsp)[i+1] = NULL;
-}
-
-
-#ifdef TEST_CUSTOM_MALLOC
-
-typedef struct my_malloc_info {
- long mmi_magic;
- size_t mmi_actualsize;
-} MyMallocInfo;
-#define MY_MALLOC_MAGIC_NUMBER 0x19940618
-
-#define MY_MALLOC_CHECK_MAGIC( p ) if ( ((MyMallocInfo *)( (p) - sizeof()
-
-void *
-my_malloc( size_t size )
-{
- void *p;
- MyMallocInfo *mmip;
-
- if (( p = malloc( size + sizeof( struct my_malloc_info ))) != NULL ) {
- mmip = (MyMallocInfo *)p;
- mmip->mmi_magic = MY_MALLOC_MAGIC_NUMBER;
- mmip->mmi_actualsize = size;
- }
-
- fprintf( stderr, "my_malloc: allocated ptr 0x%x, size %ld\n",
- p, mmip->mmi_actualsize );
-
- return( (char *)p + sizeof( MyMallocInfo ));
-}
-
-
-void *
-my_calloc( size_t nelem, size_t elsize )
-{
- void *p;
-
- if (( p = my_malloc( nelem * elsize )) != NULL ) {
- memset( p, 0, nelem * elsize );
- }
-
- return( p );
-}
-
-
-void
-my_free( void *ptr )
-{
- char *p;
- MyMallocInfo *mmip;
-
- p = (char *)ptr;
- p -= sizeof( MyMallocInfo );
- mmip = (MyMallocInfo *)p;
- if ( mmip->mmi_magic != MY_MALLOC_MAGIC_NUMBER ) {
- fprintf( stderr,
- "my_malloc_check_magic: ptr 0x%x bad magic number\n", ptr );
- exit( 1 );
- }
-
- fprintf( stderr, "my_free: freeing ptr 0x%x, size %ld\n",
- p, mmip->mmi_actualsize );
-
- memset( p, 0, mmip->mmi_actualsize + sizeof( MyMallocInfo ));
- free( p );
-}
-
-
-void *
-my_realloc( void *ptr, size_t size )
-{
- void *p;
- MyMallocInfo *mmip;
-
- if ( ptr == NULL ) {
- return( my_malloc( size ));
- }
-
- mmip = (MyMallocInfo *)( (char *)ptr - sizeof( MyMallocInfo ));
- if ( mmip->mmi_magic != MY_MALLOC_MAGIC_NUMBER ) {
- fprintf( stderr,
- "my_malloc_check_magic: ptr 0x%x bad magic number\n", ptr );
- exit( 1 );
- }
-
- if ( size <= mmip->mmi_actualsize ) { /* current block big enough? */
- return( ptr );
- }
-
- if (( p = my_malloc( size )) != NULL ) {
- memcpy( p, ptr, mmip->mmi_actualsize );
- my_free( ptr );
- }
-
- return( p );
-}
-#endif /* TEST_CUSTOM_MALLOC */
-
-int
-#ifdef WINSOCK
-ldapmain(
-#else /* WINSOCK */
-main(
-#endif /* WINSOCK */
- int argc, char **argv )
-{
- LDAP *ld;
- int rc, i, c, port, cldapflg, errflg, method, id, msgtype;
- int version;
- char line[256], command1, command2, command3;
- char passwd[64], dn[256], rdn[64], attr[64], value[256];
- char filter[256], *host, **types;
- char **exdn, *fnname;
- int bound, all, scope, attrsonly, optval, ldapversion;
- LDAPMessage *res;
- LDAPMod **mods, **attrs;
- struct timeval timeout, *tvp;
- char *copyfname = NULL;
- int copyoptions = 0;
- LDAPURLDesc *ludp;
- struct ldap_disptmpl *tmpllist = NULL;
- int changetypes, changesonly, return_echg_ctls;
- LDAPControl **tmpctrls, *newctrl, **controls = NULL;
- char *usage = "usage: %s [-u] [-h host] [-d level] [-s dnsuffix] [-p port] [-t file] [-T file] [-V protocolversion]\n";
-
- extern char *optarg;
- extern int optind;
-
-#ifdef MACOS
- if (( argv = get_list( "cmd line arg?" )) == NULL ) {
- exit( 1 );
- }
- for ( argc = 0; argv[ argc ] != NULL; ++argc ) {
- ;
- }
-#endif /* MACOS */
-
-#ifdef TEST_CUSTOM_MALLOC
- {
- struct ldap_memalloc_fns memalloc_fns;
-
- memalloc_fns.ldapmem_malloc = my_malloc;
- memalloc_fns.ldapmem_calloc = my_calloc;
- memalloc_fns.ldapmem_realloc = my_realloc;
- memalloc_fns.ldapmem_free = my_free;
-
- if ( ldap_set_option( NULL, LDAP_OPT_MEMALLOC_FN_PTRS,
- &memalloc_fns ) != 0 ) {
- fputs( "ldap_set_option failed\n", stderr );
- exit( 1 );
- }
- }
-#endif /* TEST_CUSTOM_MALLOC */
-
- host = NULL;
- port = LDAP_PORT;
- dnsuffix = "";
- cldapflg = errflg = 0;
- ldapversion = 0; /* use default */
-#ifndef _WIN32
-#ifdef LDAP_DEBUG
- ldap_debug = LDAP_DEBUG_ANY;
-#endif
-#endif
-
- while (( c = getopt( argc, argv, "uh:d:s:p:t:T:V:" )) != -1 ) {
- switch( c ) {
- case 'u':
-#ifdef CLDAP
- cldapflg++;
-#else /* CLDAP */
- printf( "Compile with -DCLDAP for UDP support\n" );
-#endif /* CLDAP */
- break;
-
- case 'd':
-#ifndef _WIN32
-#ifdef LDAP_DEBUG
- ldap_debug = atoi( optarg ) | LDAP_DEBUG_ANY;
- if ( ldap_debug & LDAP_DEBUG_PACKETS ) {
- ber_set_option( NULL, LBER_OPT_DEBUG_LEVEL,
- &ldap_debug );
- }
-#else
- printf( "Compile with -DLDAP_DEBUG for debugging\n" );
-#endif
-#endif
- break;
-
- case 'h':
- host = optarg;
- break;
-
- case 's':
- dnsuffix = optarg;
- break;
-
- case 'p':
- port = atoi( optarg );
- break;
-
-#if !defined(MACOS) && !defined(DOS)
- case 't': /* copy ber's to given file */
- copyfname = strdup( optarg );
- copyoptions = LBER_SOCKBUF_OPT_TO_FILE;
- break;
-
- case 'T': /* only output ber's to given file */
- copyfname = strdup( optarg );
- copyoptions = (LBER_SOCKBUF_OPT_TO_FILE |
- LBER_SOCKBUF_OPT_TO_FILE_ONLY);
- break;
-#endif
- case 'V': /* LDAP protocol version */
- ldapversion = atoi( optarg );
- break;
-
- default:
- ++errflg;
- }
- }
-
- if ( host == NULL && optind == argc - 1 ) {
- host = argv[ optind ];
- ++optind;
- }
-
- if ( errflg || optind < argc - 1 ) {
- fprintf( stderr, usage, argv[ 0 ] );
- exit( 1 );
- }
-
- printf( "%sldap_init( %s, %d )\n", cldapflg ? "c" : "",
- host == NULL ? "(null)" : host, port );
-
- if ( cldapflg ) {
-#ifdef CLDAP
- ld = cldap_open( host, port );
-#endif /* CLDAP */
- } else {
- ld = ldap_init( host, port );
- }
-
- if ( ld == NULL ) {
- perror( "ldap_init" );
- exit(1);
- }
-
- if ( ldapversion != 0 && ldap_set_option( ld,
- LDAP_OPT_PROTOCOL_VERSION, (void *)&ldapversion ) != 0 ) {
- ldap_perror( ld, "ldap_set_option (protocol version)" );
- exit(1);
- }
-
-#ifdef notdef
-#if !defined(MACOS) && !defined(DOS)
- if ( copyfname != NULL ) {
- int fd;
- Sockbuf *sb;
-
- if ( (fd = open( copyfname, O_WRONLY | O_CREAT, 0600 ))
- == -1 ) {
- perror( copyfname );
- exit ( 1 );
- }
- ldap_get_option( ld, LDAP_OPT_SOCKBUF, &sb );
- ber_sockbuf_set_option( sb, LBER_SOCKBUF_OPT_COPYDESC,
- (void *) &fd );
- ber_sockbuf_set_option( sb, copyoptions, LBER_OPT_ON );
- }
-#endif
-#endif
-
- bound = 0;
- timeout.tv_sec = 0;
- timeout.tv_usec = 0;
- tvp = &timeout;
-
- (void) memset( line, '\0', sizeof(line) );
- while ( getline( line, sizeof(line), stdin, "\ncommand? " ) != NULL ) {
- command1 = line[0];
- command2 = line[1];
- command3 = line[2];
-
- switch ( command1 ) {
- case 'a': /* add or abandon */
- switch ( command2 ) {
- case 'd': /* add */
- getline( dn, sizeof(dn), stdin, "dn? " );
- strcat( dn, dnsuffix );
- if ( (attrs = get_modlist( NULL, "attr? ",
- "value? " )) == NULL )
- break;
- if ( (id = ldap_add( ld, dn, attrs )) == -1 )
- ldap_perror( ld, "ldap_add" );
- else
- printf( "Add initiated with id %d\n",
- id );
- break;
-
- case 'b': /* abandon */
- getline( line, sizeof(line), stdin, "msgid? " );
- id = atoi( line );
- if ( ldap_abandon( ld, id ) != 0 )
- ldap_perror( ld, "ldap_abandon" );
- else
- printf( "Abandon successful\n" );
- break;
- default:
- printf( "Possibilities: [ad]d, [ab]ort\n" );
- }
- break;
-
- case 'v': /* ldap protocol version */
- getline( line, sizeof(line), stdin,
- "ldap version? " );
- version = atoi( line );
- if ( ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION,
- (void *) &version ) != 0 ) {
- ldap_perror( ld, "ldap_set_option" );
- }
- break;
-
- case 'b': /* asynch bind */
- getline( line, sizeof(line), stdin,
- "method 0->simple 3->sasl? " );
- method = atoi( line );
- if ( method == 0 ) {
- method = LDAP_AUTH_SIMPLE;
- } else if ( method == 3 ) {
- method = LDAP_AUTH_SASL;
- }
- getline( dn, sizeof(dn), stdin, "dn? " );
- strcat( dn, dnsuffix );
-
- if ( method == LDAP_AUTH_SIMPLE && dn[0] != '\0' ) {
- } else {
- passwd[0] = '\0';
- }
-
- if ( method == LDAP_AUTH_SIMPLE ) {
- if ( dn[0] != '\0' ) {
- getline( passwd, sizeof(passwd), stdin,
- "password? " );
- } else {
- passwd[0] = '\0';
- }
- rc = ldap_simple_bind( ld, dn, passwd );
- } else {
- struct berval cred;
- char mechanism[BUFSIZ];
-
- getline( mechanism, sizeof(mechanism), stdin,
- "mechanism? " );
- getline( passwd, sizeof(passwd), stdin,
- "credentials? " );
- cred.bv_val = passwd;
- cred.bv_len = strlen( passwd );
- if ( ldap_sasl_bind( ld, dn, mechanism, &cred,
- NULL, NULL, &rc ) != LDAP_SUCCESS ) {
- rc = -1;
- }
- }
- if ( rc == -1 ) {
- fprintf( stderr, "ldap_bind failed\n" );
- ldap_perror( ld, "ldap_bind" );
- } else {
- printf( "Bind initiated\n" );
- bound = 1;
- }
- break;
-
- case 'B': /* synch bind */
- getline( line, sizeof(line), stdin,
- "method 0->simple 3->sasl? " );
- method = atoi( line );
- if ( method == 0 ) {
- method = LDAP_AUTH_SIMPLE;
- } else if ( method == 3 ) {
- method = LDAP_AUTH_SASL;
- }
- getline( dn, sizeof(dn), stdin, "dn? " );
- strcat( dn, dnsuffix );
-
- if ( method == LDAP_AUTH_SIMPLE && dn[0] != '\0' ) {
- } else {
- passwd[0] = '\0';
- }
-
- if ( method == LDAP_AUTH_SIMPLE ) {
- if ( dn[0] != '\0' ) {
- getline( passwd, sizeof(passwd), stdin,
- "password? " );
- } else {
- passwd[0] = '\0';
- }
- rc = ldap_simple_bind_s( ld, dn, passwd );
- fnname = "ldap_simple_bind_s";
- } else {
- struct berval cred;
- char mechanism[BUFSIZ];
-
- getline( mechanism, sizeof(mechanism), stdin,
- "mechanism? " );
- getline( passwd, sizeof(passwd), stdin,
- "credentials? " );
- cred.bv_val = passwd;
- cred.bv_len = strlen( passwd );
- rc = ldap_sasl_bind_s( ld, dn, mechanism,
- &cred, NULL, NULL, NULL );
- fnname = "ldap_sasl_bind_s";
- }
- if ( rc != LDAP_SUCCESS ) {
- fprintf( stderr, "%s failed\n", fnname );
- ldap_perror( ld, fnname );
- } else {
- printf( "Bind successful\n" );
- bound = 1;
- }
- break;
-
- case 'c': /* compare */
- getline( dn, sizeof(dn), stdin, "dn? " );
- strcat( dn, dnsuffix );
- getline( attr, sizeof(attr), stdin, "attr? " );
- getline( value, sizeof(value), stdin, "value? " );
-
- if ( (id = ldap_compare( ld, dn, attr, value )) == -1 )
- ldap_perror( ld, "ldap_compare" );
- else
- printf( "Compare initiated with id %d\n", id );
- break;
-
- case 'x': /* extended operation */
- {
- char oid[100];
- struct berval val;
-
- getline( oid, sizeof(oid), stdin, "oid? " );
- getline( value, sizeof(value), stdin, "value? " );
- if ( strncmp( value, "0x", 2 ) == 0 ) {
- val.bv_val = (char *)malloc( strlen( value ) / 2 );
- berval_from_hex( &val, value + 2 );
- } else {
- val.bv_val = strdup( value );
- val.bv_len = strlen( value );
- }
- if ( ldap_extended_operation( ld, oid, &val, NULL,
- NULL, &id ) != LDAP_SUCCESS ) {
- ldap_perror( ld, "ldap_extended_operation" );
- } else {
- printf( "Extended op initiated with id %d\n",
- id );
- }
- free( val.bv_val );
- }
- break;
-
- case 'C': /* set cache parameters */
-#ifdef NO_LIBLCACHE
- getline( line, sizeof(line), stdin,
- "cache init (memcache 0)? " );
-#else
- getline( line, sizeof(line), stdin,
- "cache init (memcache 0, lcache 1)? " );
-#endif
- i = atoi( line );
- if ( i == 0 ) { /* memcache */
- unsigned long ttl, size;
- char **basedns, *dnarray[2];
- LDAPMemCache *mc;
-
- getline( line, sizeof(line), stdin,
- "memcache ttl? " );
- ttl = atoi( line );
- getline( line, sizeof(line), stdin,
- "memcache size? " );
- size = atoi( line );
- getline( line, sizeof(line), stdin,
- "memcache baseDN? " );
- if ( *line == '\0' ) {
- basedns = NULL;
- } else {
- dnarray[0] = line;
- dnarray[1] = NULL;
- basedns = dnarray;
- }
- if (( rc = ldap_memcache_init( ttl, size,
- basedns, NULL, &mc )) != LDAP_SUCCESS ) {
- fprintf( stderr,
- "ldap_memcache_init: %s\n",
- ldap_err2string( rc ));
- } else if (( rc = ldap_memcache_set( ld, mc ))
- != LDAP_SUCCESS ) {
- fprintf( stderr,
- "ldap_memcache_set: %s\n",
- ldap_err2string( rc ));
- }
-
-#ifndef NO_LIBLCACHE
- } else if ( i == 1 ) {
- getline( line, sizeof(line), stdin,
- "cache config file? " );
- if ( line[0] != '\0' ) {
- if ( lcache_init( ld, line ) != 0 ) {
- perror( "ldap_cache_init" );
- break;
- }
- }
- getline( line, sizeof(line), stdin,
- "cache on/off (on 1, off 0)? " );
- if ( line[0] != '\0' ) {
- i = atoi( line );
- if ( ldap_set_option( ld,
- LDAP_OPT_CACHE_ENABLE, &i ) != 0 ) {
- ldap_perror( ld, "ldap_cache_enable" );
- break;
- }
- }
- getline( line, sizeof(line), stdin,
- "cache strategy (check 0, populate 1, localdb 2)? " );
- if ( line[0] != '\0' ) {
- i = atoi( line );
- if ( ldap_set_option( ld,
- LDAP_OPT_CACHE_STRATEGY, &i )
- != 0 ) {
- ldap_perror(ld, "ldap_cache_strategy");
- break;
- }
- }
-#endif /* !NO_LIBLCACHE */
-
- } else {
- fprintf( stderr, "unknown cachetype %d\n", i );
- }
- break;
-
- case 'd': /* turn on debugging */
-#ifndef _WIN32
-#ifdef LDAP_DEBUG
- getline( line, sizeof(line), stdin, "debug level? " );
- ldap_debug = atoi( line ) | LDAP_DEBUG_ANY;
- if ( ldap_debug & LDAP_DEBUG_PACKETS ) {
- ber_set_option( NULL, LBER_OPT_DEBUG_LEVEL,
- &ldap_debug );
- }
-#else
- printf( "Compile with -DLDAP_DEBUG for debugging\n" );
-#endif
-#endif
- break;
-
- case 'E': /* explode a dn */
- getline( line, sizeof(line), stdin, "dn? " );
- exdn = ldap_explode_dn( line, 0 );
- for ( i = 0; exdn != NULL && exdn[i] != NULL; i++ ) {
- printf( "\t\"%s\"\n", exdn[i] );
- }
- break;
-
- case 'R': /* explode an rdn */
- getline( line, sizeof(line), stdin, "rdn? " );
- exdn = ldap_explode_rdn( line, 0 );
- for ( i = 0; exdn != NULL && exdn[i] != NULL; i++ ) {
- printf( "\t\"%s\"\n", exdn[i] );
- }
- break;
-
- case 'm': /* modify or modifyrdn */
- if ( strncmp( line, "modify", 4 ) == 0 ) {
- getline( dn, sizeof(dn), stdin, "dn? " );
- strcat( dn, dnsuffix );
- if ( (mods = get_modlist(
- "mod (0=>add, 1=>delete, 2=>replace -1=>done)? ",
- "attribute type? ", "attribute value? " ))
- == NULL )
- break;
- if ( (id = ldap_modify( ld, dn, mods )) == -1 )
- ldap_perror( ld, "ldap_modify" );
- else
- printf( "Modify initiated with id %d\n",
- id );
- } else if ( strncmp( line, "modrdn", 4 ) == 0 ) {
- getline( dn, sizeof(dn), stdin, "dn? " );
- strcat( dn, dnsuffix );
- getline( rdn, sizeof(rdn), stdin, "newrdn? " );
- getline( line, sizeof(line), stdin,
- "deleteoldrdn? " );
- if ( (id = ldap_modrdn2( ld, dn, rdn,
- atoi(line) )) == -1 )
- ldap_perror( ld, "ldap_modrdn" );
- else
- printf( "Modrdn initiated with id %d\n",
- id );
- } else {
- printf( "Possibilities: [modi]fy, [modr]dn\n" );
- }
- break;
-
- case 'q': /* quit */
-#ifdef CLDAP
- if ( cldapflg )
- cldap_close( ld );
-#endif /* CLDAP */
- if ( !cldapflg )
- ldap_unbind( ld );
- exit( 0 );
- break;
-
- case 'r': /* result or remove */
- switch ( command3 ) {
- case 's': /* result */
- getline( line, sizeof(line), stdin,
- "msgid (-1=>any)? " );
- if ( line[0] == '\0' )
- id = -1;
- else
- id = atoi( line );
- getline( line, sizeof(line), stdin,
- "all (0=>any, 1=>all)? " );
- if ( line[0] == '\0' )
- all = 1;
- else
- all = atoi( line );
- if (( msgtype = ldap_result( ld, id, all,
- tvp, &res )) < 1 ) {
- ldap_perror( ld, "ldap_result" );
- break;
- }
- printf( "\nresult: msgtype %d msgid %d\n",
- msgtype, ldap_msgid( res ) );
- handle_result( ld, res, 0 );
- res = NULL;
- break;
-
- case 'm': /* remove */
- getline( dn, sizeof(dn), stdin, "dn? " );
- strcat( dn, dnsuffix );
- if ( (id = ldap_delete( ld, dn )) == -1 )
- ldap_perror( ld, "ldap_delete" );
- else
- printf( "Remove initiated with id %d\n",
- id );
- break;
-
- default:
- printf( "Possibilities: [rem]ove, [res]ult\n" );
- break;
- }
- break;
-
- case 's': /* search */
- getline( dn, sizeof(dn), stdin, "searchbase? " );
- strcat( dn, dnsuffix );
- getline( line, sizeof(line), stdin,
- "scope (0=Base, 1=One Level, 2=Subtree)? " );
- scope = atoi( line );
- getline( filter, sizeof(filter), stdin,
- "search filter (e.g. sn=jones)? " );
- types = get_list( "attrs to return? " );
- getline( line, sizeof(line), stdin,
- "attrsonly (0=attrs&values, 1=attrs only)? " );
- attrsonly = atoi( line );
-
- if ( cldapflg ) {
-#ifdef CLDAP
- getline( line, sizeof(line), stdin,
- "Requestor DN (for logging)? " );
- if ( cldap_search_s( ld, dn, scope, filter, types,
- attrsonly, &res, line ) != 0 ) {
- ldap_perror( ld, "cldap_search_s" );
- } else {
- printf( "\nresult: msgid %d\n",
- res->lm_msgid );
- handle_result( ld, res, 0 );
- res = NULL;
- }
-#endif /* CLDAP */
- } else {
- if (( id = ldap_search( ld, dn, scope, filter,
- types, attrsonly )) == -1 ) {
- ldap_perror( ld, "ldap_search" );
- } else {
- printf( "Search initiated with id %d\n", id );
- }
- }
- free_list( types );
- break;
-
- case 't': /* set timeout value */
- getline( line, sizeof(line), stdin, "timeout (-1=infinite)? " );
- timeout.tv_sec = atoi( line );
- if ( timeout.tv_sec < 0 ) {
- tvp = NULL;
- } else {
- tvp = &timeout;
- }
- break;
-
- case 'U': /* set ufn search prefix */
- getline( line, sizeof(line), stdin, "ufn prefix? " );
- ldap_ufn_setprefix( ld, line );
- break;
-
- case 'u': /* user friendly search w/optional timeout */
- getline( dn, sizeof(dn), stdin, "ufn? " );
- strcat( dn, dnsuffix );
- types = get_list( "attrs to return? " );
- getline( line, sizeof(line), stdin,
- "attrsonly (0=attrs&values, 1=attrs only)? " );
- attrsonly = atoi( line );
-
- if ( command2 == 't' ) {
- id = ldap_ufn_search_c( ld, dn, types,
- attrsonly, &res, ldap_ufn_timeout,
- &timeout );
- } else {
- id = ldap_ufn_search_s( ld, dn, types,
- attrsonly, &res );
- }
- if ( res == NULL )
- ldap_perror( ld, "ldap_ufn_search" );
- else {
- printf( "\nresult: err %d\n", id );
- handle_result( ld, res, 0 );
- res = NULL;
- }
- free_list( types );
- break;
-
- case 'l': /* URL search */
- getline( line, sizeof(line), stdin,
- "attrsonly (0=attrs&values, 1=attrs only)? " );
- attrsonly = atoi( line );
- getline( line, sizeof(line), stdin, "LDAP URL? " );
- if (( id = ldap_url_search( ld, line, attrsonly ))
- == -1 ) {
- ldap_perror( ld, "ldap_url_search" );
- } else {
- printf( "URL search initiated with id %d\n", id );
- }
- break;
-
- case 'p': /* parse LDAP URL */
- getline( line, sizeof(line), stdin, "LDAP URL? " );
- if (( i = ldap_url_parse( line, &ludp )) != 0 ) {
- fprintf( stderr, "ldap_url_parse: error %d (%s)\n", i,
- url_parse_err2string( i ));
- } else {
- printf( "\t host: " );
- if ( ludp->lud_host == NULL ) {
- printf( "DEFAULT\n" );
- } else {
- printf( "<%s>\n", ludp->lud_host );
- }
- printf( "\t port: " );
- if ( ludp->lud_port == 0 ) {
- printf( "DEFAULT\n" );
- } else {
- printf( "%d\n", ludp->lud_port );
- }
- printf( "\tsecure: %s\n", ( ludp->lud_options &
- LDAP_URL_OPT_SECURE ) != 0 ? "Yes" : "No" );
- printf( "\t dn: " );
- if ( ludp->lud_dn == NULL ) {
- printf( "ROOT\n" );
- } else {
- printf( "%s\n", ludp->lud_dn );
- }
- printf( "\t attrs:" );
- if ( ludp->lud_attrs == NULL ) {
- printf( " ALL" );
- } else {
- for ( i = 0; ludp->lud_attrs[ i ] != NULL; ++i ) {
- printf( " <%s>", ludp->lud_attrs[ i ] );
- }
- }
- printf( "\n\t scope: %s\n", ludp->lud_scope == LDAP_SCOPE_ONELEVEL ?
- "ONE" : ludp->lud_scope == LDAP_SCOPE_BASE ? "BASE" :
- ludp->lud_scope == LDAP_SCOPE_SUBTREE ? "SUB" : "**invalid**" );
- printf( "\tfilter: <%s>\n", ludp->lud_filter );
- ldap_free_urldesc( ludp );
- }
- break;
-
- case 'n': /* set dn suffix, for convenience */
- getline( line, sizeof(line), stdin, "DN suffix? " );
- strcpy( dnsuffix, line );
- break;
-
- case 'N': /* add an LDAPv3 control */
- getline( line, sizeof(line), stdin,
- "Control oid (. to clear list)? " );
- if ( *line == '.' && *(line+1) == '\0' ) {
- controls = NULL;
- } else {
- newctrl = (LDAPControl *) malloc(
- sizeof(LDAPControl) );
- newctrl->ldctl_oid = strdup( line );
- getline( line, sizeof(line), stdin,
- "Control value? " );
- if ( strncmp( line, "0x", 2 ) == 0 ) {
- newctrl->ldctl_value.bv_val =
- (char *)malloc( strlen( line ) / 2 );
- berval_from_hex( &(newctrl->ldctl_value),
- line + 2 );
- } else {
- newctrl->ldctl_value.bv_val
- = strdup( line );
- }
- newctrl->ldctl_value.bv_len = strlen( line );
- getline( line, sizeof(line), stdin,
- "Critical (0=no, 1=yes)? " );
- newctrl->ldctl_iscritical = atoi( line );
- add_control( &controls, newctrl );
- }
- ldap_set_option( ld, LDAP_OPT_SERVER_CONTROLS,
- controls );
- ldap_get_option( ld, LDAP_OPT_SERVER_CONTROLS,
- &tmpctrls );
- print_controls( tmpctrls, 0 );
- break;
-
- case 'P': /* add a persistent search control */
- getline( line, sizeof(line), stdin, "Changetypes to "
- " return (additive - add (1), delete (2), "
- "modify (4), modDN (8))? " );
- changetypes = atoi(line);
- getline( line, sizeof(line), stdin,
- "Return changes only (0=no, 1=yes)? " );
- changesonly = atoi(line);
- getline( line, sizeof(line), stdin, "Return entry "
- "change controls (0=no, 1=yes)? " );
- return_echg_ctls = atoi(line);
- getline( line, sizeof(line), stdin,
- "Critical (0=no, 1=yes)? " );
- if ( ldap_create_persistentsearch_control( ld,
- changetypes, changesonly, return_echg_ctls,
- (char)atoi(line), &newctrl ) != LDAP_SUCCESS ) {
- ldap_perror( ld, "ldap_create_persistent"
- "search_control" );
- } else {
- add_control( &controls, newctrl );
- ldap_set_option( ld, LDAP_OPT_SERVER_CONTROLS,
- controls );
- ldap_get_option( ld, LDAP_OPT_SERVER_CONTROLS,
- &tmpctrls );
- print_controls( tmpctrls, 0 );
- }
- break;
-
- case 'o': /* set ldap options */
- getline( line, sizeof(line), stdin, "alias deref (0=never, 1=searching, 2=finding, 3=always)?" );
- i = atoi( line );
- ldap_set_option( ld, LDAP_OPT_DEREF, &i );
- getline( line, sizeof(line), stdin, "timelimit?" );
- i = atoi( line );
- ldap_set_option( ld, LDAP_OPT_TIMELIMIT, &i );
- getline( line, sizeof(line), stdin, "sizelimit?" );
- i = atoi( line );
- ldap_set_option( ld, LDAP_OPT_SIZELIMIT, &i );
-
-#ifdef STR_TRANSLATION
- getline( line, sizeof(line), stdin,
- "Automatic translation of T.61 strings (0=no, 1=yes)?" );
- if ( atoi( line ) == 0 ) {
- ld->ld_lberoptions &= ~LBER_OPT_TRANSLATE_STRINGS;
- } else {
- ld->ld_lberoptions |= LBER_OPT_TRANSLATE_STRINGS;
-#ifdef LDAP_CHARSET_8859
- getline( line, sizeof(line), stdin,
- "Translate to/from ISO-8859 (0=no, 1=yes?" );
- if ( atoi( line ) != 0 ) {
- ldap_set_string_translators( ld,
- ldap_8859_to_t61,
- ldap_t61_to_8859 );
- }
-#endif /* LDAP_CHARSET_8859 */
- }
-#endif /* STR_TRANSLATION */
-
-#ifdef LDAP_DNS
- getline( line, sizeof(line), stdin,
- "Use DN & DNS to determine where to send requests (0=no, 1=yes)?" );
- optval = ( atoi( line ) != 0 );
- ldap_set_option( ld, LDAP_OPT_DNS, (void *) optval );
-#endif /* LDAP_DNS */
-
- getline( line, sizeof(line), stdin,
- "Recognize and chase referrals (0=no, 1=yes)?" );
- optval = ( atoi( line ) != 0 );
- ldap_set_option( ld, LDAP_OPT_REFERRALS,
- (void *) optval );
- if ( optval ) {
- getline( line, sizeof(line), stdin,
- "Prompt for bind credentials when chasing referrals (0=no, 1=yes)?" );
- if ( atoi( line ) != 0 ) {
- ldap_set_rebind_proc( ld, bind_prompt,
- NULL );
- }
- }
-#ifdef NET_SSL
- getline( line, sizeof(line), stdin,
- "Use Secure Sockets Layer - SSL (0=no, 1=yes)?" );
- optval = ( atoi( line ) != 0 );
- if ( optval ) {
- getline( line, sizeof(line), stdin,
- "security DB path?" );
- if ( ldapssl_client_init( (*line == '\0') ?
- NULL : line, NULL ) < 0 ) {
- perror( "ldapssl_client_init" );
- optval = 0; /* SSL not avail. */
- } else if ( ldapssl_install_routines( ld )
- < 0 ) {
- ldap_perror( ld,
- "ldapssl_install_routines" );
- optval = 0; /* SSL not avail. */
- }
- }
-
- ldap_set_option( ld, LDAP_OPT_SSL,
- optval ? LDAP_OPT_ON : LDAP_OPT_OFF );
-
- getline( line, sizeof(line), stdin,
- "Set SSL options (0=no, 1=yes)?" );
- optval = ( atoi( line ) != 0 );
- while ( 1 ) {
- PRInt32 sslopt;
- PRBool on;
-
- getline( line, sizeof(line), stdin,
- "Option to set (0 if done)?" );
- sslopt = atoi(line);
- if ( sslopt == 0 ) {
- break;
- }
- getline( line, sizeof(line), stdin,
- "On=1, Off=0?" );
- on = ( atoi( line ) != 0 );
- if ( ldapssl_set_option( ld, sslopt, on ) != 0 ) {
- ldap_perror( ld, "ldapssl_set_option" );
- }
- }
-#endif
-
- getline( line, sizeof(line), stdin, "Reconnect?" );
- ldap_set_option( ld, LDAP_OPT_RECONNECT,
- ( atoi( line ) == 0 ) ? LDAP_OPT_OFF :
- LDAP_OPT_ON );
-
- getline( line, sizeof(line), stdin, "Async I/O?" );
- ldap_set_option( ld, LDAP_OPT_ASYNC_CONNECT,
- ( atoi( line ) == 0 ) ? LDAP_OPT_OFF :
- LDAP_OPT_ON );
- break;
-
- case 'I': /* initialize display templates */
- getline( line, sizeof(line), stdin,
- "Template file [ldaptemplates.conf]?" );
- if (( i = ldap_init_templates( *line == '\0' ?
- "ldaptemplates.conf" : line, &tmpllist ))
- != 0 ) {
- fprintf( stderr, "ldap_init_templates: %s\n",
- ldap_tmplerr2string( i ));
- }
- break;
-
- case 'T': /* read & display using template */
- getline( dn, sizeof(dn), stdin, "entry DN? " );
- strcat( dn, dnsuffix );
- if (( i = ldap_entry2text_search( ld, dn, NULL, NULL,
- tmpllist, NULL, NULL, entry2textwrite, stdout,
- "\n", 0, 0 )) != LDAP_SUCCESS ) {
- fprintf( stderr, "ldap_entry2text_search: %s\n",
- ldap_err2string( i ));
- }
- break;
-
- case 'L': /* set preferred language */
- getline( line, sizeof(line), stdin,
- "Preferred language? " );
- if ( *line == '\0' ) {
- ldap_set_option( ld,
- LDAP_OPT_PREFERRED_LANGUAGE, NULL );
- } else {
- ldap_set_option( ld,
- LDAP_OPT_PREFERRED_LANGUAGE, line );
- }
- break;
-
- case 'F': /* create filter */
- {
- char filtbuf[ 512 ], pattern[ 512 ];
- char prefix[ 512 ], suffix[ 512 ];
- char attr[ 512 ], value[ 512 ];
- char *dupvalue, **words;
-
- getline( pattern, sizeof(pattern), stdin,
- "pattern? " );
- getline( prefix, sizeof(prefix), stdin,
- "prefix? " );
- getline( suffix, sizeof(suffix), stdin,
- "suffix? " );
- getline( attr, sizeof(attr), stdin,
- "attribute? " );
- getline( value, sizeof(value), stdin,
- "value? " );
-
- if (( dupvalue = strdup( value )) != NULL ) {
- words = string2words( value, " " );
- } else {
- words = NULL;
- }
- if ( ldap_create_filter( filtbuf,
- sizeof(filtbuf), pattern, prefix, suffix,
- attr, value, words) != 0 ) {
- fprintf( stderr,
- "ldap_create_filter failed\n" );
- } else {
- printf( "filter is \"%s\"\n", filtbuf );
- }
- if ( dupvalue != NULL ) free( dupvalue );
- if ( words != NULL ) free( words );
- }
- break;
-
- case '?': /* help */
- case '\0': /* help */
- printf( "Commands: [ad]d [ab]andon [b]ind\n" );
- printf( " synch [B]ind [c]ompare [l]URL search\n" );
- printf( " [modi]fy [modr]dn [rem]ove\n" );
- printf( " [res]ult [s]earch [q]uit/unbind\n\n" );
- printf( " [u]fn search [ut]fn search with timeout\n" );
- printf( " [d]ebug [C]set cache parms[g]set msgid\n" );
- printf( " d[n]suffix [t]imeout [v]ersion\n" );
- printf( " [U]fn prefix [?]help [o]ptions\n" );
- printf( " [E]xplode dn [p]arse LDAP URL [R]explode RDN\n" );
- printf( " e[x]tended op [F]ilter create\n" );
- printf( " set co[N]trols set preferred [L]anguage\n" );
- printf( " add a [P]ersistent search control\n" );
- printf( " [I]nitialize display templates\n" );
- printf( " [T]read entry and display using template\n" );
- break;
-
- default:
- printf( "Invalid command. Type ? for help.\n" );
- break;
- }
-
- (void) memset( line, '\0', sizeof(line) );
- }
-
- return( 0 );
-}
-
-static void
-handle_result( LDAP *ld, LDAPMessage *lm, int onlyone )
-{
- int msgtype;
-
- switch ( (msgtype = ldap_msgtype( lm )) ) {
- case LDAP_RES_COMPARE:
- printf( "Compare result\n" );
- print_ldap_result( ld, lm, "compare" );
- break;
-
- case LDAP_RES_SEARCH_RESULT:
- printf( "Search result\n" );
- print_ldap_result( ld, lm, "search" );
- break;
-
- case LDAP_RES_SEARCH_ENTRY:
- printf( "Search entry\n" );
- print_search_entry( ld, lm, onlyone );
- break;
-
- case LDAP_RES_SEARCH_REFERENCE:
- printf( "Search reference\n" );
- print_search_reference( ld, lm, onlyone );
- break;
-
- case LDAP_RES_ADD:
- printf( "Add result\n" );
- print_ldap_result( ld, lm, "add" );
- break;
-
- case LDAP_RES_DELETE:
- printf( "Delete result\n" );
- print_ldap_result( ld, lm, "delete" );
- break;
-
- case LDAP_RES_MODIFY:
- printf( "Modify result\n" );
- print_ldap_result( ld, lm, "modify" );
- break;
-
- case LDAP_RES_MODRDN:
- printf( "ModRDN result\n" );
- print_ldap_result( ld, lm, "modrdn" );
- break;
-
- case LDAP_RES_BIND:
- printf( "Bind result\n" );
- print_ldap_result( ld, lm, "bind" );
- break;
- case LDAP_RES_EXTENDED:
- if ( ldap_msgid( lm ) == LDAP_RES_UNSOLICITED ) {
- printf( "Unsolicited result\n" );
- print_ldap_result( ld, lm, "unsolicited" );
- } else {
- printf( "ExtendedOp result\n" );
- print_ldap_result( ld, lm, "extendedop" );
- }
- break;
-
- default:
- printf( "Unknown result type 0x%x\n", msgtype );
- print_ldap_result( ld, lm, "unknown" );
- }
-
- if ( !onlyone ) {
- ldap_msgfree( lm );
- }
-}
-
-static void
-print_ldap_result( LDAP *ld, LDAPMessage *lm, char *s )
-{
- int lderr;
- char *matcheddn, *errmsg, *oid, **refs;
- LDAPControl **ctrls;
- struct berval *servercred, *data;
-
- if ( ldap_parse_result( ld, lm, &lderr, &matcheddn, &errmsg, &refs,
- &ctrls, 0 ) != LDAP_SUCCESS ) {
- ldap_perror( ld, "ldap_parse_result" );
- } else {
- fprintf( stderr, "%s: %s", s, ldap_err2string( lderr ));
- if ( lderr == LDAP_CONNECT_ERROR ) {
- perror( " - " );
- } else {
- fputc( '\n', stderr );
- }
- if ( errmsg != NULL ) {
- if ( *errmsg != '\0' ) {
- fprintf( stderr, "Additional info: %s\n",
- errmsg );
- }
- ldap_memfree( errmsg );
- }
- if ( matcheddn != NULL ) {
- if ( NAME_ERROR( lderr )) {
- fprintf( stderr, "Matched DN: %s\n",
- matcheddn );
- }
- ldap_memfree( matcheddn );
- }
- print_referrals( refs, 1 );
- print_controls( ctrls, 1 );
- }
-
- /* if SASL bind response, get and show server credentials */
- if ( ldap_msgtype( lm ) == LDAP_RES_BIND &&
- ldap_parse_sasl_bind_result( ld, lm, &servercred, 0 ) ==
- LDAP_SUCCESS && servercred != NULL ) {
- fputs( "\tSASL server credentials:\n", stderr );
- bprint( servercred->bv_val, servercred->bv_len );
- ber_bvfree( servercred );
- }
-
- /* if ExtendedOp response, get and show oid plus data */
- if ( ldap_msgtype( lm ) == LDAP_RES_EXTENDED &&
- ldap_parse_extended_result( ld, lm, &oid, &data, 0 ) ==
- LDAP_SUCCESS ) {
- if ( oid != NULL ) {
- if ( strcmp ( oid, LDAP_NOTICE_OF_DISCONNECTION )
- == 0 ) {
- printf(
- "\t%s Notice of Disconnection (OID: %s)\n",
- s, oid );
- } else {
- printf( "\t%s OID: %s\n", s, oid );
- }
- ldap_memfree( oid );
- }
- if ( data != NULL ) {
- printf( "\t%s data:\n", s );
- bprint( data->bv_val, data->bv_len );
- ber_bvfree( data );
- }
- }
-}
-
-static void
-print_search_entry( LDAP *ld, LDAPMessage *res, int onlyone )
-{
- BerElement *ber;
- char *a, *dn, *ufn;
- struct berval **vals;
- int i, count;
- LDAPMessage *e, *msg;
- LDAPControl **ectrls;
-
- count = 0;
- for ( msg = ldap_first_message( ld, res );
- msg != NULL && ( !onlyone || count == 0 );
- msg = ldap_next_message( ld, msg ), ++count ) {
- if ( ldap_msgtype( msg ) != LDAP_RES_SEARCH_ENTRY ) {
- handle_result( ld, msg, 1 ); /* something else */
- continue;
- }
- e = msg;
-
- dn = ldap_get_dn( ld, e );
- printf( "\tDN: %s\n", dn );
-
- ufn = ldap_dn2ufn( dn );
- printf( "\tUFN: %s\n", ufn );
-#ifdef WINSOCK
- ldap_memfree( dn );
- ldap_memfree( ufn );
-#else /* WINSOCK */
- free( dn );
- free( ufn );
-#endif /* WINSOCK */
-
- for ( a = ldap_first_attribute( ld, e, &ber ); a != NULL;
- a = ldap_next_attribute( ld, e, ber ) ) {
- printf( "\t\tATTR: %s\n", a );
- if ( (vals = ldap_get_values_len( ld, e, a ))
- == NULL ) {
- printf( "\t\t\t(no values)\n" );
- } else {
- for ( i = 0; vals[i] != NULL; i++ ) {
- int nonascii = 0;
- unsigned long j;
-
- for ( j = 0; j < vals[i]->bv_len; j++ )
- if ( !isascii( vals[i]->bv_val[j] ) ) {
- nonascii = 1;
- break;
- }
-
- if ( nonascii ) {
- printf( "\t\t\tlength (%ld) (not ascii)\n", vals[i]->bv_len );
-#ifdef BPRINT_NONASCII
- bprint( vals[i]->bv_val,
- vals[i]->bv_len );
-#endif /* BPRINT_NONASCII */
- continue;
- }
- printf( "\t\t\tlength (%ld) %s\n",
- vals[i]->bv_len, vals[i]->bv_val );
- }
- ber_bvecfree( vals );
- }
- ldap_memfree( a );
- }
- if ( ldap_get_lderrno( ld, NULL, NULL ) != LDAP_SUCCESS ) {
- ldap_perror( ld,
- "ldap_first_attribute/ldap_next_attribute" );
- }
- if ( ber != NULL ) {
- ber_free( ber, 0 );
- }
-
- if ( ldap_get_entry_controls( ld, e, &ectrls )
- != LDAP_SUCCESS ) {
- ldap_perror( ld, "ldap_get_entry_controls" );
- } else {
- int changenumpresent;
- ber_int_t changetype;
- char *prevdn;
- ber_int_t changenum;
-
- if ( ldap_parse_entrychange_control( ld, ectrls,
- &changetype, &prevdn, &changenumpresent,
- &changenum ) == LDAP_SUCCESS ) {
- fprintf( stderr, "EntryChangeNotification\n"
- "\tchangeType: %s\n",
- changetype_num2string( changetype ));
- if ( prevdn != NULL ) {
- fprintf( stderr,
- "\tpreviousDN: \"%s\"\n",
- prevdn );
- }
- if ( changenumpresent ) {
- fprintf( stderr, "\tchangeNumber: %d\n",
- changenum );
- }
- if ( prevdn != NULL ) {
- free( prevdn );
- }
- }
- print_controls( ectrls, 1 );
- }
- }
-}
-
-
-static char *
-changetype_num2string( ber_int_t chgtype )
-{
- static char buf[ 25 ];
- char *s;
-
- switch( chgtype ) {
- case LDAP_CHANGETYPE_ADD:
- s = "add";
- break;
- case LDAP_CHANGETYPE_DELETE:
- s = "delete";
- break;
- case LDAP_CHANGETYPE_MODIFY:
- s = "modify";
- break;
- case LDAP_CHANGETYPE_MODDN:
- s = "moddn";
- break;
- default:
- s = buf;
- sprintf( s, "unknown (%d)", chgtype );
- }
-
- return( s );
-}
-
-
-static void
-print_search_reference( LDAP *ld, LDAPMessage *res, int onlyone )
-{
- LDAPMessage *msg;
- LDAPControl **ctrls;
- char **refs;
- int count;
-
- count = 0;
- for ( msg = ldap_first_message( ld, res );
- msg != NULL && ( !onlyone || count == 0 );
- msg = ldap_next_message( ld, msg ), ++count ) {
- if ( ldap_msgtype( msg ) != LDAP_RES_SEARCH_REFERENCE ) {
- handle_result( ld, msg, 1 ); /* something else */
- continue;
- }
-
- if ( ldap_parse_reference( ld, msg, &refs, &ctrls, 0 ) !=
- LDAP_SUCCESS ) {
- ldap_perror( ld, "ldap_parse_reference" );
- } else {
- print_referrals( refs, 1 );
- print_controls( ctrls, 1 );
- }
- }
-}
-
-
-static void
-print_referrals( char **refs, int freeit )
-{
- int i;
-
- if ( refs == NULL ) {
- return;
- }
-
- fprintf( stderr, "Referrals:\n" );
- for ( i = 0; refs[ i ] != NULL; ++i ) {
- fprintf( stderr, "\t%s\n", refs[ i ] );
- }
-
- if ( freeit ) {
- ldap_value_free( refs );
- }
-}
-
-
-static void
-print_controls( LDAPControl **ctrls, int freeit )
-{
- int i;
-
- if ( ctrls == NULL ) {
- return;
- }
-
- fprintf( stderr, "Controls:\n" );
- for ( i = 0; ctrls[ i ] != NULL; ++i ) {
- if ( i > 0 ) {
- fputs( "\t-----------\n", stderr );
- }
- fprintf( stderr, "\toid: %s\n", ctrls[ i ]->ldctl_oid );
- fprintf( stderr, "\tcritical: %s\n",
- ctrls[ i ]->ldctl_iscritical ? "YES" : "NO" );
- fputs( "\tvalue:\n", stderr );
- bprint( ctrls[ i ]->ldctl_value.bv_val,
- ctrls[ i ]->ldctl_value.bv_len );
- }
-
- if ( freeit ) {
- ldap_controls_free( ctrls );
- }
-}
-
-
-static int
-entry2textwrite( void *fp, char *buf, int len )
-{
- return( fwrite( buf, len, 1, (FILE *)fp ) == 0 ? -1 : len );
-}
-
-
-/* similar to getfilter.c:break_into_words() */
-static char **
-string2words( char *str, char *delims )
-{
- char *word, **words;
- int count;
- char *lasts;
-
- if (( words = (char **)calloc( 1, sizeof( char * ))) == NULL ) {
- return( NULL );
- }
- count = 0;
- words[ count ] = NULL;
-
- word = ldap_utf8strtok_r( str, delims, &lasts );
- while ( word != NULL ) {
- if (( words = (char **)realloc( words,
- ( count + 2 ) * sizeof( char * ))) == NULL ) {
- free( words );
- return( NULL );
- }
-
- words[ count ] = word;
- words[ ++count ] = NULL;
- word = ldap_utf8strtok_r( NULL, delims, &lasts );
- }
-
- return( words );
-}
-
-
-static const char *
-url_parse_err2string( int e )
-{
- const char *s = "unknown";
-
- switch( e ) {
- case LDAP_URL_ERR_NOTLDAP:
- s = "URL doesn't begin with \"ldap://\"";
- break;
- case LDAP_URL_ERR_NODN:
- s = "URL has no DN (required)";
- break;
- case LDAP_URL_ERR_BADSCOPE:
- s = "URL scope string is invalid";
- break;
- case LDAP_URL_ERR_MEM:
- s = "can't allocate memory space";
- break;
- case LDAP_URL_ERR_PARAM:
- s = "bad parameter to an URL function";
- break;
- case LDAP_URL_UNRECOGNIZED_CRITICAL_EXTENSION:
- s = "unrecognized critical URL extension";
- break;
- }
-
- return( s );
-}
-
-
-/*
- * Print arbitrary stuff, for debugging.
- */
-
-#define BPLEN 48
-static void
-bprint( char *data, int len )
-{
- static char hexdig[] = "0123456789abcdef";
- char out[ BPLEN ];
- int i = 0;
-
- memset( out, 0, BPLEN );
- for ( ;; ) {
- if ( len < 1 ) {
- fprintf( stderr, "\t%s\n", ( i == 0 ) ? "(end)" : out );
- break;
- }
-
-#ifndef HEX
- if ( isgraph( (unsigned char)*data )) {
- out[ i ] = ' ';
- out[ i+1 ] = *data;
- } else {
-#endif
- out[ i ] = hexdig[ ( *data & 0xf0 ) >> 4 ];
- out[ i+1 ] = hexdig[ *data & 0x0f ];
-#ifndef HEX
- }
-#endif
- i += 2;
- len--;
- data++;
-
- if ( i > BPLEN - 2 ) {
- fprintf( stderr, "\t%s\n", out );
- memset( out, 0, BPLEN );
- i = 0;
- continue;
- }
- out[ i++ ] = ' ';
- }
-
- fflush( stderr );
-}