From db3175eaba867406581d419dc89c3dde7eabdd1c Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Fri, 2 Oct 2015 05:14:53 +0100 Subject: [PATCH] ITS#8262 more extended ops --- libraries/libldap/compare.c | 2 + libraries/libldap/extended.c | 89 ++++++++++++++++++++++-------------- libraries/libldap/ldap-int.h | 12 +++++ 3 files changed, 68 insertions(+), 35 deletions(-) diff --git a/libraries/libldap/compare.c b/libraries/libldap/compare.c index dbeb44aee2..822f1e927a 100644 --- a/libraries/libldap/compare.c +++ b/libraries/libldap/compare.c @@ -77,6 +77,8 @@ ldap_build_compare_req( ber_free( ber, 1 ); return( NULL ); } + + return( ber ); } /* diff --git a/libraries/libldap/extended.c b/libraries/libldap/extended.c index af69bbf64a..3e52e91fec 100644 --- a/libraries/libldap/extended.c +++ b/libraries/libldap/extended.c @@ -25,6 +25,57 @@ #include "ldap-int.h" #include "ldap_log.h" +BerElement * +ldap_build_extended_req( + LDAP *ld, + LDAP_CONST char *reqoid, + struct berval *reqdata, + LDAPControl **sctrls, + LDAPControl **cctrls, + ber_int_t *msgidp ) +{ + BerElement *ber; + int rc; + + /* create a message to send */ + if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) { + return( NULL ); + } + + LDAP_NEXT_MSGID( ld, *msgidp ); + if ( reqdata != NULL ) { + rc = ber_printf( ber, "{it{tstON}", /* '}' */ + *msgidp, LDAP_REQ_EXTENDED, + LDAP_TAG_EXOP_REQ_OID, reqoid, + LDAP_TAG_EXOP_REQ_VALUE, reqdata ); + + } else { + rc = ber_printf( ber, "{it{tsN}", /* '}' */ + *msgidp, LDAP_REQ_EXTENDED, + LDAP_TAG_EXOP_REQ_OID, reqoid ); + } + + if( rc == -1 ) { + ld->ld_errno = LDAP_ENCODING_ERROR; + ber_free( ber, 1 ); + return( NULL ); + } + + /* Put Server Controls */ + if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) { + ber_free( ber, 1 ); + return( NULL ); + } + + if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) { + ld->ld_errno = LDAP_ENCODING_ERROR; + ber_free( ber, 1 ); + return( NULL ); + } + + return( ber ); +} + /* * LDAPv3 Extended Operation Request * ExtendedRequest ::= [APPLICATION 23] SEQUENCE { @@ -68,42 +119,10 @@ ldap_extended_operation( return( ld->ld_errno ); } - /* create a message to send */ - if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) { - ld->ld_errno = LDAP_NO_MEMORY; - return( ld->ld_errno ); - } - - LDAP_NEXT_MSGID( ld, id ); - if ( reqdata != NULL ) { - rc = ber_printf( ber, "{it{tstON}", /* '}' */ - id, LDAP_REQ_EXTENDED, - LDAP_TAG_EXOP_REQ_OID, reqoid, - LDAP_TAG_EXOP_REQ_VALUE, reqdata ); - - } else { - rc = ber_printf( ber, "{it{tsN}", /* '}' */ - id, LDAP_REQ_EXTENDED, - LDAP_TAG_EXOP_REQ_OID, reqoid ); - } - - if( rc == -1 ) { - ld->ld_errno = LDAP_ENCODING_ERROR; - ber_free( ber, 1 ); - return( ld->ld_errno ); - } - - /* Put Server Controls */ - if( ldap_int_put_controls( ld, sctrls, ber ) != LDAP_SUCCESS ) { - ber_free( ber, 1 ); - return ld->ld_errno; - } - - if ( ber_printf( ber, /*{*/ "N}" ) == -1 ) { - ld->ld_errno = LDAP_ENCODING_ERROR; - ber_free( ber, 1 ); + ber = ldap_build_extended_req( ld, reqoid, reqdata, + sctrls, cctrls, &id ); + if ( !ber ) return( ld->ld_errno ); - } /* send the message */ *msgidp = ldap_send_initial_request( ld, LDAP_REQ_EXTENDED, NULL, ber, id ); diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index 5f74c0906a..63cad53d06 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -566,6 +566,18 @@ LDAP_F (BerElement *) ldap_build_delete_req LDAP_P(( LDAPControl **cctrls, ber_int_t *msgidp )); +/* + * in extended.c + */ + +LDAP_F (BerElement *) ldap_build_extended_req LDAP_P(( + LDAP *ld, + const char *reqoid, + struct berval *reqdata, + LDAPControl **sctrls, + LDAPControl **cctrls, + ber_int_t *msgidp )); + /* * in init.c */ -- 2.39.5