if (want_bindpw) {
passwd.bv_val = getpassphrase("Enter LDAP Password: ");
- passwd.bv_len = strlen( passwd.bv_val );
+ passwd.bv_len = passwd.bv_val ? strlen( passwd.bv_val ) : 0;
}
if ( authmethod == LDAP_AUTH_SASL ) {
if (want_bindpw) {
passwd.bv_val = getpassphrase("Enter LDAP Password: ");
- passwd.bv_len = strlen( passwd.bv_val );
+ passwd.bv_len = passwd.bv_val ? strlen( passwd.bv_val ) : 0;
}
if ( authmethod == LDAP_AUTH_SASL ) {
if (want_bindpw) {
passwd.bv_val = getpassphrase("Enter LDAP Password: ");
- passwd.bv_len = strlen( passwd.bv_val );
+ passwd.bv_len = passwd.bv_val ? strlen( passwd.bv_val ) : 0;
}
if ( authmethod == LDAP_AUTH_SASL ) {
newpw = strdup(getpassphrase("Old password: "));
ckoldpw = getpassphrase("Re-enter old password: ");
- if( strncmp( oldpw, ckoldpw, strlen(oldpw) )) {
+ if( newpw== NULL || ckoldpw == NULL ||
+ strncmp( oldpw, ckoldpw, strlen(oldpw) ))
+ {
fprintf( stderr, "passwords do not match\n" );
return EXIT_FAILURE;
}
newpw = strdup(getpassphrase("New password: "));
cknewpw = getpassphrase("Re-enter new password: ");
- if( strncmp( newpw, cknewpw, strlen(newpw) )) {
+ if( newpw== NULL || cknewpw == NULL ||
+ strncmp( newpw, cknewpw, strlen(newpw) ))
+ {
fprintf( stderr, "passwords do not match\n" );
return EXIT_FAILURE;
}
/* handle bind password */
fprintf( stderr, "Bind DN: %s\n", binddn );
passwd.bv_val = strdup( getpassphrase("Enter bind password: "));
- passwd.bv_len = strlen( passwd.bv_val );
+ passwd.bv_len = passwd.bv_val ? strlen( passwd.bv_val ) : 0;
}
if ( debug ) {
free(newpw);
}
- ber_printf( ber, /*{*/ "}" );
+ ber_printf( ber, /*{*/ "N}" );
rc = ber_flatten( ber, &bv );
#include "ldif.h"
#include "ldap_defaults.h"
-#undef DEPSEP
-#define DEFSEP "="
-
static void
usage( const char *s )
{
exit( EXIT_FAILURE );
}
+static void print_extended(
+ LDAP *ld,
+ LDAPMessage *extended );
+
+static void print_partial(
+ LDAP *ld,
+ LDAPMessage *partial );
+
+static void print_reference(
+ LDAP *ld,
+ LDAPMessage *reference );
+
static void print_entry LDAP_P((
LDAP *ld,
LDAPMessage *entry,
static int sasl_privacy = 0;
#endif
static int use_tls = 0;
-static char *sep = DEFSEP;
static char *sortattr = NULL;
static int skipsortattr = 0;
-static int verbose, not, includeufn, binary, vals2tmp, ldif;
+static int verbose, not, includeufn, vals2tmp, ldif;
int
main( int argc, char **argv )
LDAP *ld;
infile = NULL;
- debug = verbose = binary = not = vals2tmp =
+ debug = verbose = not = vals2tmp =
attrsonly = manageDSAit = ldif = want_bindpw = 0;
deref = sizelimit = timelimit = version = -1;
authmethod = LDAP_AUTH_SIMPLE;
while (( i = getopt( argc, argv,
- "Aa:Bb:D:d:EF:f:h:IKkLl:MnP:p:RS:s:T:tU:uV:vWw:X:Y:Zz:")) != EOF )
+ "Aa:b:D:d:Ef:h:IKkLl:MnP:p:RS:s:T:tU:uV:vWw:X:Y:Zz:")) != EOF )
{
switch( i ) {
- case 'n': /* do Not do any searches */
+ case 'n': /* do nothing */
++not;
break;
case 'v': /* verbose mode */
break;
case 'L': /* print entries in LDIF format */
++ldif;
- /* fall through -- always allow binary when outputting LDIF */
- case 'B': /* allow binary values to be printed */
- ++binary;
break;
+
case 's': /* search scope */
if ( strcasecmp( optarg, "base" ) == 0 ) {
scope = LDAP_SCOPE_BASE;
- } else if ( strcasecmp( optarg, "one" ) == 0 ) {
+ } else if ( strncasecmp( optarg, "one", sizeof("one")-1 ) == 0 ) {
scope = LDAP_SCOPE_ONELEVEL;
- } else if ( strcasecmp( optarg, "sub" ) == 0 ) {
+ } else if ( strncasecmp( optarg, "sub", sizeof("sub")-1 ) == 0 ) {
scope = LDAP_SCOPE_SUBTREE;
} else {
fprintf( stderr, "scope should be base, one, or sub\n" );
case 'a': /* set alias deref option */
if ( strcasecmp( optarg, "never" ) == 0 ) {
deref = LDAP_DEREF_NEVER;
- } else if ( strcasecmp( optarg, "search" ) == 0 ) {
+ } else if ( strncasecmp( optarg, "search", sizeof("search")-1 ) == 0 ) {
deref = LDAP_DEREF_SEARCHING;
- } else if ( strcasecmp( optarg, "find" ) == 0 ) {
+ } else if ( strncasecmp( optarg, "find", sizeof("find")-1 ) == 0 ) {
deref = LDAP_DEREF_FINDING;
} else if ( strcasecmp( optarg, "always" ) == 0 ) {
deref = LDAP_DEREF_ALWAYS;
if( urlpre ) free( urlpre );
urlpre = strdup( optarg );
break;
- case 'F': /* field separator */
- sep = strdup( optarg );
- break;
case 'f': /* input file */
infile = strdup( optarg );
break;
}
}
-#define LDAP_LDIF 1
-#ifdef LDAP_LDIF
/* no alternative format */
if( ldif == 0 ) ldif = 1;
-#endif
if ( ( authmethod == LDAP_AUTH_KRBV4 ) || ( authmethod ==
LDAP_AUTH_KRBV41 ) ) {
referrals ? "on" : "off" );
}
- if (version != -1 &&
- ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version ) != LDAP_OPT_SUCCESS )
+ if (version == -1 ) {
+ version = 3;
+ }
+
+ if( ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version )
+ != LDAP_OPT_SUCCESS )
{
- fprintf( stderr, "Could not set LDAP_OPT_PROTOCOL_VERSION %d\n", version );
+ fprintf( stderr, "Could not set LDAP_OPT_PROTOCOL_VERSION %d\n",
+ version );
}
if ( use_tls && ldap_start_tls_s( ld, NULL, NULL ) != LDAP_SUCCESS ) {
if (want_bindpw) {
passwd.bv_val = getpassphrase("Enter LDAP Password: ");
- passwd.bv_len = strlen( passwd.bv_val );
+ passwd.bv_len = passwd.bv_val ? strlen( passwd.bv_val ) : 0;
}
if ( authmethod == LDAP_AUTH_SASL ) {
argv[0] );
return( EXIT_FAILURE );
#endif
- }
- else {
+ } else {
if ( ldap_bind_s( ld, binddn, passwd.bv_val, authmethod )
!= LDAP_SUCCESS ) {
ldap_perror( ld, "ldap_bind" );
fprintf( stderr, "\n" );
}
- if ( ldif ) {
- if (ldif < 3 ) {
- printf( "version: 1\n\n");
- }
+ if (ldif < 3 ) {
+ printf( "version: 2\n\n");
+ }
- if (ldif < 2 ) {
- printf( "#\n# filter%s: %s\n# returning: ",
- infile != NULL ? " pattern" : "",
- filtpattern );
+ if (ldif < 2 ) {
+ printf( "#\n# filter%s: %s\n# returning: ",
+ infile != NULL ? " pattern" : "",
+ filtpattern );
- if ( attrs == NULL ) {
- printf( "ALL" );
- } else {
- for ( i = 0; attrs[ i ] != NULL; ++i ) {
- printf( "%s ", attrs[ i ] );
- }
+ if ( attrs == NULL ) {
+ printf( "ALL" );
+ } else {
+ for ( i = 0; attrs[ i ] != NULL; ++i ) {
+ printf( "%s ", attrs[ i ] );
}
- printf( "\n#\n\n" );
}
+ printf( "\n#\n\n" );
}
if ( infile == NULL ) {
char *value)
{
char filter[ BUFSIZ ];
- int rc, first, matches;
- LDAPMessage *res, *e;
+ int rc, first;
+ int nresponses;
+ int nentries;
+ int nreferences;
+ int nextended;
+ int npartial;
+ LDAPMessage *res, *msg;
+ ber_int_t msgid;
if( filtpatt != NULL ) {
sprintf( filter, filtpatt, value );
return( LDAP_SUCCESS );
}
- if ( ldap_search( ld, base, scope, filter, attrs, attrsonly ) == -1 ) {
+ msgid = ldap_search( ld, base, scope, filter, attrs, attrsonly );
+ if( msgid == -1 ) {
int ld_errno;
ldap_perror( ld, "ldap_search" );
-
ldap_get_option(ld, LDAP_OPT_ERROR_NUMBER, &ld_errno);
return( ld_errno );
}
- matches = 0;
- first = 1;
- res = NULL;
- while ( (rc = ldap_result( ld, LDAP_RES_ANY, sortattr ? 1 : 0, NULL, &res ))
- == LDAP_RES_SEARCH_ENTRY ) {
- matches++;
- e = ldap_first_entry( ld, res );
- if ( !first ) {
- putchar( '\n' );
- } else {
- first = 0;
- }
- print_entry( ld, e, attrsonly );
- ldap_msgfree( res );
+ nresponses = nentries = nreferences = nextended = npartial = 0;
+
res = NULL;
+ while ((rc = ldap_result( ld, LDAP_RES_ANY,
+ sortattr ? 1 : 0, NULL, &res )) > 0 )
+ {
+ if( sortattr ) {
+ (void) ldap_sort_entries( ld, &res,
+ ( *sortattr == '\0' ) ? NULL : sortattr, strcasecmp );
+ }
+
+ for ( msg = ldap_first_message( ld, res );
+ msg != NULL;
+ msg = ldap_next_message( ld, msg ) )
+ {
+ nresponses++;
+
+ switch( ldap_msgtype( msg ) ) {
+ case LDAP_RES_SEARCH_ENTRY:
+ if( nresponses > 1 ) putchar('\n');
+ nentries++;
+ print_entry( ld, msg, attrsonly );
+ break;
+
+ case LDAP_RES_SEARCH_REFERENCE:
+ if( nresponses > 1 ) putchar('\n');
+ nreferences++;
+ print_reference( ld, msg );
+ break;
+
+ case LDAP_RES_EXTENDED:
+ if( nresponses > 1 ) putchar('\n');
+ nextended++;
+ print_extended( ld, msg );
+
+ rc = ldap_result2error( ld, msg, 0 );
+
+ if( rc != LDAP_SUCCESS ) {
+ ldap_perror( ld, "ldap_search" );
+ }
+
+ if( ldap_msgid( msg ) == 0 ) {
+ /* unsolicited extended operation */
+ goto done;
+ }
+
+ break;
+
+ case LDAP_RES_EXTENDED_PARTIAL:
+ if( nresponses > 1 ) putchar('\n');
+ npartial++;
+ print_partial( ld, msg );
+ break;
+
+ case LDAP_RES_SEARCH_RESULT:
+ /* if( nresponses > 1 ) putchar('\n'); */
+ rc = ldap_result2error( ld, msg, 0 );
+
+ if( rc != LDAP_SUCCESS ) {
+ ldap_perror( ld, "ldap_search" );
+ }
+
+ goto done;
+
+ }
+ }
+
+ ldap_msgfree( res );
}
+
if ( rc == -1 ) {
- ldap_perror( ld, "ldap_result" );
+ ldap_perror( ld, "ldap_result" );
+ return( rc );
+ }
+
+done:
+ if ( verbose ) {
+ printf( "%d responses\n", nresponses );
+ }
+
return( rc );
+}
+
+
+static void print_reference(
+ LDAP *ld,
+ LDAPMessage *reference )
+{
+ int rc, i;
+ char **refs = NULL;
+
+ if( ldif == 1 ) {
+ printf("# search reference\n");
}
- if (( rc = ldap_result2error( ld, res, 0 )) != LDAP_SUCCESS ) {
- ldap_perror( ld, "ldap_search" );
+
+ rc = ldap_parse_reference( ld, reference, &refs, NULL, 0 );
+
+ for( i=0; refs[i] != NULL; i++ ) {
+ write_ldif( LDIF_PUT_VALUE, "ref", refs[i], strlen(refs[i]) );
}
- if ( sortattr != NULL ) {
- (void) ldap_sort_entries( ld, &res,
- ( *sortattr == '\0' ) ? NULL : sortattr, strcasecmp );
- matches = 0;
- first = 1;
- for ( e = ldap_first_entry( ld, res ); e != NULL;
- e = ldap_next_entry( ld, e ) ) {
- matches++;
- if ( !first ) {
- putchar( '\n' );
- } else {
- first = 0;
- }
- print_entry( ld, e, attrsonly );
- }
+
+ ber_memvfree( (void **) refs );
+
+ if( rc != LDAP_SUCCESS ) {
+ ldap_perror(ld, "ldap_parse_reference");
+ exit( EXIT_FAILURE );
}
+}
- if ( verbose ) {
- printf( "%d matches\n", matches );
+static void print_extended(
+ LDAP *ld,
+ LDAPMessage *extended )
+{
+ char rst[16];
+ int rc;
+ char *retoid = NULL;
+ struct berval *retdata = NULL;
+
+ if( ldif == 1 ) {
+ printf("# extended result response\n");
}
- ldap_msgfree( res );
- return( rc );
+ rc = ldap_parse_extended_result( ld, extended,
+ &retoid, &retdata, 0 );
+
+ write_ldif( LDIF_PUT_VALUE, "extended",
+ retoid, retoid ? strlen(retoid) : 0 );
+
+ if(retdata) {
+ write_ldif( LDIF_PUT_BINARY, "data",
+ retdata->bv_val, retdata->bv_len );
+ }
+
+ sprintf( rst, "%ld", (long) rst );
+ write_ldif( LDIF_PUT_VALUE, "result", rst, strlen(rst));
+
+ if( rc != LDAP_SUCCESS ) {
+ ldap_perror(ld, "ldap_parse_extended_result");
+ exit( EXIT_FAILURE );
+ }
}
+static void print_partial(
+ LDAP *ld,
+ LDAPMessage *partial )
+{
+ int rc;
+ char *retoid = NULL;
+ struct berval *retdata = NULL;
+
+ if( ldif == 1 ) {
+ printf("# extended partial response\n");
+ }
+
+ rc = ldap_parse_extended_partial( ld, partial,
+ &retoid, &retdata, NULL, 0 );
+
+ write_ldif( LDIF_PUT_VALUE, "partial",
+ retoid, retoid ? strlen(retoid) : 0 );
+
+ if(retdata) {
+ write_ldif( LDIF_PUT_BINARY, "data",
+ retdata->bv_val, retdata->bv_len );
+ }
+
+ if( rc != LDAP_SUCCESS ) {
+ ldap_perror(ld, "ldap_parse_extended_partial");
+ exit( EXIT_FAILURE );
+ }
+}
static void
print_entry(
if ( ldif == 1 ) {
ufn = ldap_dn2ufn( dn );
- write_ldif( LDIF_PUT_COMMENT, NULL, ufn, strlen( ufn ));
+ write_ldif( LDIF_PUT_COMMENT, NULL, ufn, ufn ? strlen( ufn ) : 0 );
}
if ( ldif ) {
- write_ldif( LDIF_PUT_VALUE, "dn", dn, strlen( dn ));
+ write_ldif( LDIF_PUT_VALUE, "dn", dn, dn ? strlen( dn ) : 0);
} else {
printf( "%s\n", dn );
}
ufn = ldap_dn2ufn( dn );
}
if ( ldif ) {
- write_ldif( LDIF_PUT_VALUE, "ufn", ufn, strlen( ufn ));
+ write_ldif( LDIF_PUT_VALUE, "ufn", ufn, ufn ? strlen( ufn ) : 0 );
} else {
printf( "%s\n", ufn );
}
sprintf( url, "%s%s", urlpre,
&tmpfname[strlen(tmpdir) + sizeof(LDAP_DIRSEP) - 1] );
- if ( ldif ) {
- write_ldif( LDIF_PUT_URL, a, url, strlen( url ));
- } else {
- printf( "%s%s%s\n", a, sep, url );
- }
-
+ write_ldif( LDIF_PUT_URL, a, url, strlen( url ));
} else {
- if ( ldif ) {
- write_ldif( LDIF_PUT_VALUE, a,
- bvals[ i ]->bv_val, bvals[ i ]->bv_len );
-
- } else {
- int notprint = !binary && !vals2tmp
- && ldif_is_not_printable( bvals[i]->bv_val,
- bvals[i]->bv_len );
- printf( "%s%s", a, sep );
- puts( notprint ? "NOT PRINTABLE" : bvals[ i ]->bv_val );
- }
+ write_ldif( LDIF_PUT_VALUE, a,
+ bvals[ i ]->bv_val, bvals[ i ]->bv_len );
}
}
ber_bvecfree( bvals );
struct berval **retdatap,
int freeit ));
+LDAP_F( int )
+ldap_parse_extended_partial LDAP_P((
+ LDAP *ld,
+ LDAPMessage *res,
+ char **retoidp,
+ struct berval **retdatap,
+ LDAPControl ***serverctrls,
+ int freeit ));
+
/*
* in abandon.c:
*/
return( ber_put_seqorset( ber ) );
}
+/* N tag */
+static ber_tag_t lber_int_null = 0;
+
/* VARARGS */
int
ber_printf( BerElement *ber, LDAP_CONST char *fmt, ... )
rc = ber_put_null( ber, ber->ber_tag );
break;
+ case 'N': /* Debug NULL */
+ if( lber_int_null != 0 ) {
+ /* Insert NULL to ensure peer ignores unknown tags */
+ rc = ber_put_null( ber, lber_int_null );
+ } else {
+ rc = 0;
+ }
+ break;
+
case 'o': /* octet string (non-null terminated) */
s = va_arg( ap, char * );
len = va_arg( ap, ber_len_t );
}
fprintf(stderr, "encode: end\n" );
- if( ber_printf( ber, /*{*/ "}" ) == -1 ) {
+ if( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
perror( /*{*/ "ber_printf }" );
return( EXIT_FAILURE );
}
} else {
/* close '{' */
- err = ber_printf( ber, /*{*/ "}" );
+ err = ber_printf( ber, /*{*/ "N}" );
if( err == -1 ) {
/* encoding error */
/* for each attribute in the entry... */
for ( i = 0; attrs[i] != NULL; i++ ) {
if ( ( attrs[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) {
- rc = ber_printf( ber, "{s[V]}", attrs[i]->mod_type,
+ rc = ber_printf( ber, "{s[V]N}", attrs[i]->mod_type,
attrs[i]->mod_bvalues );
} else {
- rc = ber_printf( ber, "{s[v]}", attrs[i]->mod_type,
+ rc = ber_printf( ber, "{s[v]N}", attrs[i]->mod_type,
attrs[i]->mod_values );
}
if ( rc == -1 ) {
}
}
- if ( ber_printf( ber, /*{{*/ "}}" ) == -1 ) {
+ if ( ber_printf( ber, /*{{*/ "N}N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return ld->ld_errno;
return ld->ld_errno;
}
- if ( ber_printf( ber, /*{*/ "}" ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return ld->ld_errno;
return( LDAP_NO_MEMORY );
}
- if ( ber_printf( ber, "{it{s{sO}}", /* '}' */
+ if ( ber_printf( ber, "{it{s{sON}N}", /* '}' */
++ld->ld_msgid,
LDAP_REQ_COMPARE, dn, attr, bvalue ) == -1 )
{
return ld->ld_errno;
}
- if( ber_printf( ber, /*{*/ "}" ) == -1 ) {
+ if( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( ld->ld_errno );
}
- if( ber_printf( ber, /*{*/"}" ) == -1 ) {
+ if( ber_printf( ber, /*{*/"N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
return ld->ld_errno;
}
}
- if( ber_printf( ber, /*{*/"}" ) == -1 ) {
+ if( ber_printf( ber, /*{*/ "}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
return ld->ld_errno;
}
return ld->ld_errno;
}
- if ( ber_printf( ber, /*{*/ "}" ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( ld->ld_errno );
for ( lm = r; lm->lm_chain != NULL; lm = lm->lm_chain ) {
/* skip over entries and references */
if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
- lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE )
+ lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
+ lm->lm_msgtype != LDAP_RES_EXTENDED_PARTIAL )
{
break;
}
for ( lm = lm->lm_chain; lm != NULL; lm = lm->lm_chain ) {
/* skip over entries and references */
if( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
- lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE )
+ lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
+ lm->lm_msgtype != LDAP_RES_EXTENDED_PARTIAL )
{
/* more results to return */
errcode = LDAP_MORE_RESULTS_TO_RETURN;
}
if ( reqdata != NULL ) {
- rc = ber_printf( ber, "{it{tstO}", /* '}' */
+ rc = ber_printf( ber, "{it{tstON}", /* '}' */
++ld->ld_msgid, LDAP_REQ_EXTENDED,
LDAP_TAG_EXOP_REQ_OID, reqoid,
LDAP_TAG_EXOP_REQ_VALUE, reqdata );
} else {
- rc = ber_printf( ber, "{it{ts}", /* '}' */
+ rc = ber_printf( ber, "{it{tsN}", /* '}' */
++ld->ld_msgid, LDAP_REQ_EXTENDED,
LDAP_TAG_EXOP_REQ_OID, reqoid );
}
return ld->ld_errno;
}
- if ( ber_printf( ber, /*{*/ "}" ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( ld->ld_errno );
return LDAP_SUCCESS;
}
+
+
+/* Parse an extended partial */
+int
+ldap_parse_extended_partial (
+ LDAP *ld,
+ LDAPMessage *res,
+ char **retoidp,
+ struct berval **retdatap,
+ LDAPControl ***serverctrls,
+ int freeit )
+{
+ BerElement *ber;
+ ber_tag_t rc;
+ ber_tag_t tag;
+ ber_len_t len;
+ struct berval *resdata;
+ char *resoid;
+
+ assert( ld != NULL );
+ assert( LDAP_VALID( ld ) );
+ assert( res != NULL );
+
+ Debug( LDAP_DEBUG_TRACE, "ldap_parse_extended_result\n", 0, 0, 0 );
+
+ if( ld->ld_version < LDAP_VERSION3 ) {
+ ld->ld_errno = LDAP_NOT_SUPPORTED;
+ return ld->ld_errno;
+ }
+
+ if( res->lm_msgtype != LDAP_RES_EXTENDED_PARTIAL ) {
+ ld->ld_errno = LDAP_PARAM_ERROR;
+ return ld->ld_errno;
+ }
+
+ if( retoidp != NULL ) *retoidp = NULL;
+ if( retdatap != NULL ) *retdatap = NULL;
+
+ ber = ber_dup( res->lm_ber );
+
+ if ( ber == NULL ) {
+ ld->ld_errno = LDAP_NO_MEMORY;
+ return ld->ld_errno;
+ }
+
+ rc = ber_scanf( ber, "{" /*}*/ );
+
+ if( rc == LBER_ERROR ) {
+ ld->ld_errno = LDAP_DECODING_ERROR;
+ ber_free( ber, 0 );
+ return ld->ld_errno;
+ }
+
+ resoid = NULL;
+ resdata = NULL;
+
+ tag = ber_peek_tag( ber, &len );
+
+ if( tag == LDAP_TAG_EXOP_RES_OID ) {
+ /* we have a resoid */
+ if( ber_scanf( ber, "a", &resoid ) == LBER_ERROR ) {
+ ld->ld_errno = LDAP_DECODING_ERROR;
+ ber_free( ber, 0 );
+ return ld->ld_errno;
+ }
+
+ tag = ber_peek_tag( ber, &len );
+ }
+
+ if( tag == LDAP_TAG_EXOP_RES_VALUE ) {
+ /* we have a resdata */
+ if( ber_scanf( ber, "O", &resdata ) == LBER_ERROR ) {
+ ld->ld_errno = LDAP_DECODING_ERROR;
+ ber_free( ber, 0 );
+ if( resoid != NULL ) LDAP_FREE( resoid );
+ return ld->ld_errno;
+ }
+ }
+
+ if ( serverctrls == NULL ) {
+ rc = LDAP_SUCCESS;
+ goto free_and_return;
+ }
+
+ if ( ber_scanf( ber, /*{*/ "}" ) == LBER_ERROR ) {
+ rc = LDAP_DECODING_ERROR;
+ goto free_and_return;
+ }
+
+ rc = ldap_int_get_controls( ber, serverctrls );
+
+free_and_return:
+ ber_free( ber, 0 );
+
+ if( retoidp != NULL ) {
+ *retoidp = resoid;
+ } else {
+ LDAP_FREE( resoid );
+ }
+
+ if( retdatap != NULL ) {
+ *retdatap = resdata;
+ } else {
+ ber_bvfree( resdata );
+ }
+
+ if( freeit ) {
+ ldap_msgfree( res );
+ }
+
+ return LDAP_SUCCESS;
+}
}
/* fill it in */
- rc = ber_printf( ber, "{it{isto}}", ++ld->ld_msgid, LDAP_REQ_BIND,
+ rc = ber_printf( ber, "{it{istoN}N}", ++ld->ld_msgid, LDAP_REQ_BIND,
ld->ld_version, dn, LDAP_AUTH_KRBV41, cred, credlen );
if ( rc == -1 ) {
}
/* fill it in */
- rc = ber_printf( ber, "{it{isto}}", ++ld->ld_msgid, LDAP_REQ_BIND,
+ rc = ber_printf( ber, "{it{istoN}N}", ++ld->ld_msgid, LDAP_REQ_BIND,
ld->ld_version, dn, LDAP_AUTH_KRBV42, cred, credlen );
#ifdef LDAP_CONNECTIONLESS
LDAP_F (int) cldap_getmsg( LDAP *ld, struct timeval *timeout, BerElement *ber );
#endif
+LDAP_F (char *) ldap_int_msgtype2str( ber_tag_t tag );
/*
* in search.c
/* for each modification to be performed... */
for ( i = 0; mods[i] != NULL; i++ ) {
if (( mods[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) {
- rc = ber_printf( ber, "{e{s[V]}}",
+ rc = ber_printf( ber, "{e{s[V]N}N}",
(ber_int_t) ( mods[i]->mod_op & ~LDAP_MOD_BVALUES ),
mods[i]->mod_type, mods[i]->mod_bvalues );
} else {
- rc = ber_printf( ber, "{e{s[v]}}",
+ rc = ber_printf( ber, "{e{s[v]N}N}",
(ber_int_t) mods[i]->mod_op,
mods[i]->mod_type, mods[i]->mod_values );
}
}
}
- if ( ber_printf( ber, /*{{*/ "}}" ) == -1 ) {
+ if ( ber_printf( ber, /*{{*/ "N}N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( ld->ld_errno );
return ld->ld_errno;
}
- if ( ber_printf( ber, /*{*/ "}" ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( ld->ld_errno );
return( ld->ld_errno );
}
- rc = ber_printf( ber, "{it{ssbts}", /* '}' */
+ rc = ber_printf( ber, "{it{ssbtsN}", /* '}' */
++ld->ld_msgid, LDAP_REQ_MODDN,
dn, newrdn, (ber_int_t) deleteoldrdn,
LDAP_TAG_NEWSUPERIOR, newSuperior );
} else {
- rc = ber_printf( ber, "{it{ssb}", /* '}' */
+ rc = ber_printf( ber, "{it{ssbN}", /* '}' */
++ld->ld_msgid, LDAP_REQ_MODDN,
dn, newrdn, (ber_int_t) deleteoldrdn );
}
return ld->ld_errno;
}
- rc = ber_printf( ber, /*{*/ "}" );
+ rc = ber_printf( ber, /*{*/ "N}" );
if ( rc < 0 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
if ( tag == LDAP_REQ_BIND ) {
rc = ber_printf( ber, "{it{is" /*}}*/, msgid, tag, ver, *dnp );
} else if ( tag == LDAP_REQ_DELETE ) {
- rc = ber_printf( ber, "{its}", msgid, tag, *dnp );
+ rc = ber_printf( ber, "{itsN}", msgid, tag, *dnp );
} else {
rc = ber_printf( ber, "{it{s" /*}}*/, msgid, tag, *dnp );
}
if ( tag != LDAP_REQ_DELETE && (
ber_write(ber, tmpber.ber_ptr, ( tmpber.ber_end - tmpber.ber_ptr ), 0)
!= ( tmpber.ber_end - tmpber.ber_ptr ) ||
- ber_printf( ber, /*{{*/ "}}" ) == -1 ) )
+ ber_printf( ber, /*{{*/ "N}N}" ) == -1 ) )
{
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
if ( all == LDAP_MSG_ONE
|| (lm->lm_msgtype != LDAP_RES_SEARCH_RESULT
&& lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE /* LDAPv3 */
- && lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY) )
+ && lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY
+ && lm->lm_msgtype != LDAP_RES_EXTENDED_PARTIAL) )
break;
for ( tmp = lm; tmp != NULL; tmp = tmp->lm_chain ) {
}
Debug( LDAP_DEBUG_TRACE, "ldap_read: message type %s msgid %ld, original id %ld\n",
- ( tag == LDAP_RES_SEARCH_ENTRY ) ? "entry" :
- ( tag == LDAP_RES_SEARCH_REFERENCE ) ? "reference" : "result",
+ ldap_int_msgtype2str( tag ),
(long) lr->lr_msgid, (long) lr->lr_origid );
id = lr->lr_origid;
/* part of a search response - add to end of list of entries */
for ( tmp = l; (tmp->lm_chain != NULL) &&
((tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY) ||
- (tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE));
+ (tmp->lm_chain->lm_msgtype == LDAP_RES_SEARCH_REFERENCE) ||
+ (tmp->lm_chain->lm_msgtype == LDAP_RES_EXTENDED_PARTIAL ));
tmp = tmp->lm_chain )
; /* NULL */
tmp->lm_chain = new;
}
+char * ldap_int_msgtype2str( ber_tag_t tag )
+{
+ switch( tag ) {
+ case LDAP_RES_ADD: return "add";
+ case LDAP_RES_BIND: return "bind";
+ case LDAP_RES_COMPARE: return "compare";
+ case LDAP_RES_DELETE: return "delete";
+ case LDAP_RES_EXTENDED: return "extended-result";
+ case LDAP_RES_EXTENDED_PARTIAL: return "extended-partial";
+ case LDAP_RES_MODIFY: return "modify";
+ case LDAP_RES_RENAME: return "rename";
+ case LDAP_RES_SEARCH_ENTRY: return "search-entry";
+ case LDAP_RES_SEARCH_REFERENCE: return "search-reference";
+ case LDAP_RES_SEARCH_RESULT: return "search-result";
+ }
+ return "unknown";
+}
+
int
ldap_msgfree( LDAPMessage *lm )
{
if( mechanism == LDAP_SASL_SIMPLE ) {
/* simple bind */
- rc = ber_printf( ber, "{it{istO}" /*}*/,
+ rc = ber_printf( ber, "{it{istON}" /*}*/,
++ld->ld_msgid, LDAP_REQ_BIND,
ld->ld_version, dn, LDAP_AUTH_SIMPLE,
cred );
} else if ( cred == NULL ) {
/* SASL bind w/o creditials */
- rc = ber_printf( ber, "{it{ist{s}}" /*}*/,
+ rc = ber_printf( ber, "{it{ist{sN}N}" /*}*/,
++ld->ld_msgid, LDAP_REQ_BIND,
ld->ld_version, dn, LDAP_AUTH_SASL,
mechanism );
} else {
/* SASL bind w/ creditials */
- rc = ber_printf( ber, "{it{ist{sO}}" /*}*/,
+ rc = ber_printf( ber, "{it{ist{sON}N}" /*}*/,
++ld->ld_msgid, LDAP_REQ_BIND,
ld->ld_version, dn, LDAP_AUTH_SASL,
mechanism, cred );
return ld->ld_errno;
}
- if ( ber_printf( ber, /*{*/ "}" ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return ld->ld_errno;
return( ld->ld_errno );
}
- if( rc == LDAP_RES_SEARCH_REFERENCE) {
+ if( rc == LDAP_RES_SEARCH_REFERENCE || rc == LDAP_RES_EXTENDED_PARTIAL ) {
return( ld->ld_errno );
}
return( NULL );
}
- if ( ber_printf( ber, /*{*/ "{v}}", attrs ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "{v}N}", attrs ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( NULL );
return( NULL );
}
- if ( ber_printf( ber, /*{*/ "}", attrs ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( NULL );
*next++ = ')';
/* flush explicit tagged thang */
- if ( ber_printf( ber, /*{*/ "}" ) == -1 )
+ if ( ber_printf( ber, /*{*/ "N}" ) == -1 )
return( NULL );
return( next );
ber_slen_t len = ldap_pvt_filter_value_unescape( value );
if( len >= 0 ) {
- rc = ber_printf( ber, "totb}",
+ rc = ber_printf( ber, "totbN}",
LDAP_FILTER_EXT_VALUE, value, len,
LDAP_FILTER_EXT_DNATTRS, dn != NULL);
} else {
ber_slen_t len = ldap_pvt_filter_value_unescape( value );
if( len >= 0 ) {
- rc = ber_printf( ber, "t{so}",
+ rc = ber_printf( ber, "t{soN}",
ftype, str, value, len );
}
}
gotstar = 1;
}
- if ( ber_printf( ber, /* {{ */ "}}" ) == -1 )
+ if ( ber_printf( ber, /* {{ */ "N}N}" ) == -1 )
return( -1 );
return( 0 );
if( tag == LBER_ERROR ) goto exit;
}
- tag = ber_printf(ber, /*{*/ "}");
+ tag = ber_printf(ber, /*{*/ "N}");
if( tag == LBER_ERROR ) goto exit;
}
- tag = ber_printf(ber, /*{*/ "}");
+ tag = ber_printf(ber, /*{*/ "N}");
if( tag == LBER_ERROR ) goto exit;
ld->ld_errno = ldap_int_create_control( LDAP_CONTROL_SORTREQUEST,
return ld->ld_errno;
}
- if ( ber_printf( ber, /*{*/ "}", LDAP_REQ_UNBIND ) == -1 ) {
+ if ( ber_printf( ber, /*{*/ "N}", LDAP_REQ_UNBIND ) == -1 ) {
ld->ld_errno = LDAP_ENCODING_ERROR;
ber_free( ber, 1 );
return( ld->ld_errno );
if( tag == LBER_ERROR ) goto exit;
if (vlvinfop->ldvlv_attrvalue == NULL) {
- tag = ber_printf(ber, "t{ii}",
+ tag = ber_printf(ber, "t{iiN}",
LDAP_VLVBYINDEX_IDENTIFIER,
vlvinfop->ldvlv_offset,
vlvinfop->ldvlv_count);
if( tag == LBER_ERROR ) goto exit;
}
- tag = ber_printf(ber, /*{*/ "}");
+ tag = ber_printf(ber, /*{*/ "N}");
if( tag == LBER_ERROR ) goto exit;
ld->ld_errno = ldap_int_create_control(
if( ber == NULL ) return NULL;
- rc = ber_printf( ber, "{tO}",
+ rc = ber_printf( ber, "{tON}",
LDAP_TAG_EXOP_X_MODIFY_PASSWD_GEN, cred );
if( rc == -1 ) {
#ifdef LDAP_CONNECTIONLESS
if ( op->o_cldap ) {
- rc = ber_printf( ber, "{is{t{ess}}}", msgid, "", tag,
+ rc = ber_printf( ber, "{is{t{essN}N}N}", msgid, "", tag,
err, matched ? matched : "", text ? text : "" );
} else
#endif
}
if( rc != -1 ) {
- rc = ber_printf( ber, "}}" );
+ rc = ber_printf( ber, "N}N}" );
}
}
}
}
- if (( rc = ber_printf( ber, /*{[*/ "]}" )) == -1 ) {
+ if (( rc = ber_printf( ber, /*{[*/ "]N}" )) == -1 ) {
Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 );
ber_free( ber, 1 );
send_ldap_result( conn, op, LDAP_OTHER,
}
}
- if (( rc = ber_printf( ber, /*{[*/ "]}" )) == -1 ) {
+ if (( rc = ber_printf( ber, /*{[*/ "]N}" )) == -1 ) {
Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 );
ber_free( ber, 1 );
send_ldap_result( conn, op, LDAP_OTHER,
attrs_free( aa );
- rc = ber_printf( ber, /*{{{*/ "}}}" );
+ rc = ber_printf( ber, /*{{{*/ "}N}N}" );
if ( rc == -1 ) {
Debug( LDAP_DEBUG_ANY, "ber_printf failed\n", 0, 0, 0 );
return -1;
}
- rc = ber_printf( ber, "{it{V}}", op->o_msgid,
+ rc = ber_printf( ber, "{it{V}N}", op->o_msgid,
LDAP_RES_SEARCH_REFERENCE, refs );
if ( rc == -1 ) {