X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Ftxn.c;h=d5ac2d7c2f8342b2b392fbe5570e8aacefc57937;hb=7d13ef7e42f1514dd99878835a13a700da4f4b69;hp=8c17ea6948a2dbdfa705ff8001590f664a8e4c08;hpb=fad69dbef82204861d359fb9192c851c102aed1d;p=openldap diff --git a/libraries/libldap/txn.c b/libraries/libldap/txn.c index 8c17ea6948..d5ac2d7c2f 100644 --- a/libraries/libldap/txn.c +++ b/libraries/libldap/txn.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2006 The OpenLDAP Foundation. + * Copyright 2006-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -76,9 +76,9 @@ ldap_txn_end( txnber = ber_alloc_t( LBER_USE_DER ); if( commit ) { - ber_printf( txnber, "{o}", txnid ); + ber_printf( txnber, "{ON}", txnid ); } else { - ber_printf( txnber, "{bo}", commit, txnid ); + ber_printf( txnber, "{bON}", commit, txnid ); } ber_flatten( txnber, &txnval ); @@ -102,19 +102,53 @@ ldap_txn_end_s( int rc; BerElement *txnber = NULL; struct berval *txnval = NULL; + struct berval *retdata = NULL; + + if ( retidp != NULL ) *retidp = -1; txnber = ber_alloc_t( LBER_USE_DER ); if( commit ) { - ber_printf( txnber, "{o}", txnid ); + ber_printf( txnber, "{ON}", txnid ); } else { - ber_printf( txnber, "{bo}", commit, txnid ); + ber_printf( txnber, "{bON}", commit, txnid ); } ber_flatten( txnber, &txnval ); rc = ldap_extended_operation_s( ld, LDAP_EXOP_X_TXN_END, - txnval, sctrls, cctrls, NULL, NULL ); + txnval, sctrls, cctrls, NULL, &retdata ); + + ber_free( txnber, 1 ); + + /* parse retdata */ + if( retdata != NULL ) { + BerElement *ber; + ber_tag_t tag; + ber_int_t retid; + + if( retidp == NULL ) goto done; + + ber = ber_init( retdata ); + + if( ber == NULL ) { + rc = ld->ld_errno = LDAP_NO_MEMORY; + goto done; + } + + tag = ber_scanf( ber, "i", &retid ); + ber_free( ber, 1 ); + + if ( tag != LBER_INTEGER ) { + rc = ld->ld_errno = LDAP_DECODING_ERROR; + goto done; + } + + *retidp = (int) retid; + +done: + ber_bvfree( retdata ); + } return rc; }