mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
print control response (may need to condition with an arg switch?)
This commit is contained in:
parent
e83f0f900b
commit
78ce7e2d32
@ -42,6 +42,8 @@
|
||||
|
||||
#include <ldap.h>
|
||||
|
||||
#include "ldif.h"
|
||||
#include "lutil.h"
|
||||
#include "lutil_ldap.h"
|
||||
#include "ldap_defaults.h"
|
||||
#include "ldap_pvt.h"
|
||||
@ -1301,3 +1303,79 @@ tool_check_abandon( LDAP *ld, int msgid )
|
||||
return 0;
|
||||
}
|
||||
|
||||
void tool_print_ctrls(
|
||||
LDAPControl **ctrls,
|
||||
int ldif )
|
||||
{
|
||||
int i;
|
||||
char *ptr;
|
||||
|
||||
for ( i = 0; ctrls[i] != NULL; i++ ) {
|
||||
/* control: OID criticality base64value */
|
||||
struct berval *b64 = NULL;
|
||||
ber_len_t len;
|
||||
char *str;
|
||||
|
||||
len = ldif ? 2 : 0;
|
||||
len += strlen( ctrls[i]->ldctl_oid );
|
||||
|
||||
/* add enough for space after OID and the critical value itself */
|
||||
len += ctrls[i]->ldctl_iscritical
|
||||
? sizeof("true") : sizeof("false");
|
||||
|
||||
/* convert to base64 */
|
||||
if( ctrls[i]->ldctl_value.bv_len ) {
|
||||
b64 = ber_memalloc( sizeof(struct berval) );
|
||||
|
||||
b64->bv_len = LUTIL_BASE64_ENCODE_LEN(
|
||||
ctrls[i]->ldctl_value.bv_len ) + 1;
|
||||
b64->bv_val = ber_memalloc( b64->bv_len + 1 );
|
||||
|
||||
b64->bv_len = lutil_b64_ntop(
|
||||
(unsigned char *) ctrls[i]->ldctl_value.bv_val,
|
||||
ctrls[i]->ldctl_value.bv_len,
|
||||
b64->bv_val, b64->bv_len );
|
||||
}
|
||||
|
||||
if ( b64 ) {
|
||||
len += 1 + b64->bv_len;
|
||||
}
|
||||
|
||||
ptr = str = malloc( len + 1 );
|
||||
if ( ldif ) {
|
||||
ptr = lutil_strcopy( ptr, ": " );
|
||||
}
|
||||
ptr = lutil_strcopy( ptr, ctrls[i]->ldctl_oid );
|
||||
ptr = lutil_strcopy( ptr, ctrls[i]->ldctl_iscritical
|
||||
? " true" : " false" );
|
||||
|
||||
if( b64 ) {
|
||||
ptr = lutil_strcopy( ptr, " " );
|
||||
ptr = lutil_strcopy( ptr, b64->bv_val );
|
||||
}
|
||||
|
||||
if ( ldif < 2 ) {
|
||||
tool_write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
"control", str, len );
|
||||
}
|
||||
|
||||
free( str );
|
||||
ber_bvfree( b64 );
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
tool_write_ldif( int type, char *name, char *value, ber_len_t vallen )
|
||||
{
|
||||
char *ldif;
|
||||
|
||||
if (( ldif = ldif_put( type, name, value, vallen )) == NULL ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
fputs( ldif, stdout );
|
||||
ber_memfree( ldif );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
@ -89,6 +89,9 @@ void tool_perror LDAP_P((
|
||||
const char *matched,
|
||||
const char *info,
|
||||
char **refs ));
|
||||
void tool_print_ctrls LDAP_P(( LDAPControl **ctrls, int ldif ));
|
||||
int tool_write_ldif LDAP_P(( int type, char *name, char *value, ber_len_t vallen ));
|
||||
|
||||
|
||||
LDAP_END_DECL
|
||||
|
||||
|
@ -1178,10 +1178,11 @@ static int process_response(
|
||||
|
||||
msgtype = ldap_msgtype( res );
|
||||
if ( msgtype != LDAP_RES_INTERMEDIATE ) {
|
||||
int err;
|
||||
char *text = NULL, *matched = NULL, **refs = NULL;
|
||||
int err;
|
||||
char *text = NULL, *matched = NULL, **refs = NULL;
|
||||
LDAPControl **ctrls = NULL;
|
||||
|
||||
rc = ldap_parse_result( ld, res, &err, &matched, &text, &refs, NULL, 1 );
|
||||
rc = ldap_parse_result( ld, res, &err, &matched, &text, &refs, &ctrls, 1 );
|
||||
if ( rc == LDAP_SUCCESS ) {
|
||||
rc = err;
|
||||
}
|
||||
@ -1201,6 +1202,10 @@ static int process_response(
|
||||
if ( text ) {
|
||||
ber_memvfree( (void **)refs );
|
||||
}
|
||||
if ( ctrls != NULL ) {
|
||||
tool_print_ctrls( ctrls, 0 );
|
||||
ldap_controls_free( ctrls );
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -178,15 +178,6 @@ static int print_result(
|
||||
LDAPMessage *result,
|
||||
int search );
|
||||
|
||||
static void print_ctrls(
|
||||
LDAPControl **ctrls );
|
||||
|
||||
static int write_ldif LDAP_P((
|
||||
int type,
|
||||
char *name,
|
||||
char *value,
|
||||
ber_len_t vallen ));
|
||||
|
||||
static int dosearch LDAP_P((
|
||||
LDAP *ld,
|
||||
char *base,
|
||||
@ -1305,9 +1296,9 @@ print_entry(
|
||||
|
||||
if ( ldif < 2 ) {
|
||||
ufn = ldap_dn2ufn( bv.bv_val );
|
||||
write_ldif( LDIF_PUT_COMMENT, NULL, ufn, ufn ? strlen( ufn ) : 0 );
|
||||
tool_write_ldif( LDIF_PUT_COMMENT, NULL, ufn, ufn ? strlen( ufn ) : 0 );
|
||||
}
|
||||
write_ldif( LDIF_PUT_VALUE, "dn", bv.bv_val, bv.bv_len );
|
||||
tool_write_ldif( LDIF_PUT_VALUE, "dn", bv.bv_val, bv.bv_len );
|
||||
|
||||
rc = ldap_get_entry_controls( ld, entry, &ctrls );
|
||||
if( rc != LDAP_SUCCESS ) {
|
||||
@ -1317,7 +1308,7 @@ print_entry(
|
||||
}
|
||||
|
||||
if( ctrls ) {
|
||||
print_ctrls( ctrls );
|
||||
tool_print_ctrls( ctrls, ldif );
|
||||
ldap_controls_free( ctrls );
|
||||
}
|
||||
|
||||
@ -1325,7 +1316,7 @@ print_entry(
|
||||
if( ufn == NULL ) {
|
||||
ufn = ldap_dn2ufn( bv.bv_val );
|
||||
}
|
||||
write_ldif( LDIF_PUT_VALUE, "ufn", ufn, ufn ? strlen( ufn ) : 0 );
|
||||
tool_write_ldif( LDIF_PUT_VALUE, "ufn", ufn, ufn ? strlen( ufn ) : 0 );
|
||||
}
|
||||
|
||||
if( ufn != NULL ) ldap_memfree( ufn );
|
||||
@ -1339,7 +1330,7 @@ print_entry(
|
||||
if (bv.bv_val == NULL) break;
|
||||
|
||||
if ( attrsonly ) {
|
||||
write_ldif( LDIF_PUT_NOVALUE, bv.bv_val, NULL, 0 );
|
||||
tool_write_ldif( LDIF_PUT_NOVALUE, bv.bv_val, NULL, 0 );
|
||||
|
||||
} else if ( bvals ) {
|
||||
for ( i = 0; bvals[i].bv_val != NULL; i++ ) {
|
||||
@ -1379,10 +1370,10 @@ print_entry(
|
||||
&tmpfname[strlen(tmpdir) + sizeof(LDAP_DIRSEP) - 1] );
|
||||
|
||||
urlize( url );
|
||||
write_ldif( LDIF_PUT_URL, bv.bv_val, url, strlen( url ));
|
||||
tool_write_ldif( LDIF_PUT_URL, bv.bv_val, url, strlen( url ));
|
||||
|
||||
} else {
|
||||
write_ldif( LDIF_PUT_VALUE, bv.bv_val,
|
||||
tool_write_ldif( LDIF_PUT_VALUE, bv.bv_val,
|
||||
bvals[ i ].bv_val, bvals[ i ].bv_len );
|
||||
}
|
||||
}
|
||||
@ -1417,14 +1408,14 @@ static void print_reference(
|
||||
if( refs ) {
|
||||
int i;
|
||||
for( i=0; refs[i] != NULL; i++ ) {
|
||||
write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
tool_write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
"ref", refs[i], strlen(refs[i]) );
|
||||
}
|
||||
ber_memvfree( (void **) refs );
|
||||
}
|
||||
|
||||
if( ctrls ) {
|
||||
print_ctrls( ctrls );
|
||||
tool_print_ctrls( ctrls, ldif );
|
||||
ldap_controls_free( ctrls );
|
||||
}
|
||||
}
|
||||
@ -1450,14 +1441,14 @@ static void print_extended(
|
||||
}
|
||||
|
||||
if ( ldif < 2 ) {
|
||||
write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
tool_write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
"extended", retoid, retoid ? strlen(retoid) : 0 );
|
||||
}
|
||||
ber_memfree( retoid );
|
||||
|
||||
if(retdata) {
|
||||
if ( ldif < 2 ) {
|
||||
write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_BINARY,
|
||||
tool_write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_BINARY,
|
||||
"data", retdata->bv_val, retdata->bv_len );
|
||||
}
|
||||
ber_bvfree( retdata );
|
||||
@ -1488,7 +1479,7 @@ static void print_partial(
|
||||
}
|
||||
|
||||
if ( ldif < 2 ) {
|
||||
write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
tool_write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
"partial", retoid, retoid ? strlen(retoid) : 0 );
|
||||
}
|
||||
|
||||
@ -1496,7 +1487,7 @@ static void print_partial(
|
||||
|
||||
if( retdata ) {
|
||||
if ( ldif < 2 ) {
|
||||
write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_BINARY,
|
||||
tool_write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_BINARY,
|
||||
"data", retdata->bv_val, retdata->bv_len );
|
||||
}
|
||||
|
||||
@ -1504,7 +1495,7 @@ static void print_partial(
|
||||
}
|
||||
|
||||
if( ctrls ) {
|
||||
print_ctrls( ctrls );
|
||||
tool_print_ctrls( ctrls, ldif );
|
||||
ldap_controls_free( ctrls );
|
||||
}
|
||||
}
|
||||
@ -1548,7 +1539,7 @@ static int print_result(
|
||||
if( matcheddn ) {
|
||||
if( *matcheddn ) {
|
||||
if( !ldif ) {
|
||||
write_ldif( LDIF_PUT_VALUE,
|
||||
tool_write_ldif( LDIF_PUT_VALUE,
|
||||
"matchedDN", matcheddn, strlen(matcheddn) );
|
||||
} else {
|
||||
fprintf( stderr, _("Matched DN: %s\n"), matcheddn );
|
||||
@ -1561,7 +1552,7 @@ static int print_result(
|
||||
if( text ) {
|
||||
if( *text ) {
|
||||
if( !ldif ) {
|
||||
write_ldif( LDIF_PUT_TEXT, "text",
|
||||
tool_write_ldif( LDIF_PUT_TEXT, "text",
|
||||
text, strlen(text) );
|
||||
} else {
|
||||
fprintf( stderr, _("Additional information: %s\n"), text );
|
||||
@ -1575,7 +1566,7 @@ static int print_result(
|
||||
int i;
|
||||
for( i=0; refs[i] != NULL; i++ ) {
|
||||
if( !ldif ) {
|
||||
write_ldif( LDIF_PUT_VALUE, "ref", refs[i], strlen(refs[i]) );
|
||||
tool_write_ldif( LDIF_PUT_VALUE, "ref", refs[i], strlen(refs[i]) );
|
||||
} else {
|
||||
fprintf( stderr, _("Referral: %s\n"), refs[i] );
|
||||
}
|
||||
@ -1585,89 +1576,13 @@ static int print_result(
|
||||
}
|
||||
|
||||
if( ctrls ) {
|
||||
print_ctrls( ctrls );
|
||||
tool_print_ctrls( ctrls, ldif );
|
||||
ldap_controls_free( ctrls );
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void print_ctrls(
|
||||
LDAPControl **ctrls )
|
||||
{
|
||||
int i;
|
||||
for(i=0; ctrls[i] != NULL; i++ ) {
|
||||
/* control: OID criticality base64value */
|
||||
struct berval *b64 = NULL;
|
||||
ber_len_t len;
|
||||
char *str;
|
||||
|
||||
len = ldif ? 2 : 0;
|
||||
len += strlen( ctrls[i]->ldctl_oid );
|
||||
|
||||
/* add enough for space after OID and the critical value itself */
|
||||
len += ctrls[i]->ldctl_iscritical
|
||||
? sizeof("true") : sizeof("false");
|
||||
|
||||
/* convert to base64 */
|
||||
if( ctrls[i]->ldctl_value.bv_len ) {
|
||||
b64 = ber_memalloc( sizeof(struct berval) );
|
||||
|
||||
b64->bv_len = LUTIL_BASE64_ENCODE_LEN(
|
||||
ctrls[i]->ldctl_value.bv_len ) + 1;
|
||||
b64->bv_val = ber_memalloc( b64->bv_len + 1 );
|
||||
|
||||
b64->bv_len = lutil_b64_ntop(
|
||||
(unsigned char *) ctrls[i]->ldctl_value.bv_val,
|
||||
ctrls[i]->ldctl_value.bv_len,
|
||||
b64->bv_val, b64->bv_len );
|
||||
}
|
||||
|
||||
if( b64 ) {
|
||||
len += 1 + b64->bv_len;
|
||||
}
|
||||
|
||||
str = malloc( len + 1 );
|
||||
if ( ldif ) {
|
||||
strcpy( str, ": " );
|
||||
} else {
|
||||
str[0] = '\0';
|
||||
}
|
||||
strcat( str, ctrls[i]->ldctl_oid );
|
||||
strcat( str, ctrls[i]->ldctl_iscritical
|
||||
? " true" : " false" );
|
||||
|
||||
if( b64 ) {
|
||||
strcat(str, " ");
|
||||
strcat(str, b64->bv_val );
|
||||
}
|
||||
|
||||
if ( ldif < 2 ) {
|
||||
write_ldif( ldif ? LDIF_PUT_COMMENT : LDIF_PUT_VALUE,
|
||||
"control", str, len );
|
||||
}
|
||||
|
||||
free( str );
|
||||
ber_bvfree( b64 );
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
write_ldif( int type, char *name, char *value, ber_len_t vallen )
|
||||
{
|
||||
char *ldif;
|
||||
|
||||
if (( ldif = ldif_put( type, name, value, vallen )) == NULL ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
fputs( ldif, stdout );
|
||||
ber_memfree( ldif );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
#ifdef LDAP_CONTROL_PAGEDRESULTS
|
||||
static int
|
||||
parse_page_control(
|
||||
|
Loading…
Reference in New Issue
Block a user