X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fextended.c;h=3e52e91fecbc43d9a6b4176439429e46b0b69a5b;hb=a684e79970998a3180b445397b00af6f982713d3;hp=c1acf7f4cbe3bde9f700c43be6ba1902c491ca11;hpb=b8edf539f21664f84c9acbb006ffa26aa7cd4931;p=openldap diff --git a/libraries/libldap/extended.c b/libraries/libldap/extended.c index c1acf7f4cb..3e52e91fec 100644 --- a/libraries/libldap/extended.c +++ b/libraries/libldap/extended.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2013 The OpenLDAP Foundation. + * Copyright 1998-2015 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -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 );