X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Ftxn.c;h=82cd465de4d2962ff3fd3bf0bdade3d9a2cf4f89;hb=de01a6e3d791d3458549d2ceeccf4d7e0477ff78;hp=3f40599d8b1545f476c5c19913fa0caed5f450e9;hpb=e323437c6aa2cc7791dfc14c31fe0439b71c56e2;p=openldap diff --git a/libraries/libldap/txn.c b/libraries/libldap/txn.c index 3f40599d8b..82cd465de4 100644 --- a/libraries/libldap/txn.c +++ b/libraries/libldap/txn.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2004 The OpenLDAP Foundation. + * Copyright 2006-2007 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -13,40 +13,143 @@ * . */ /* ACKNOWLEDGEMENTS: - * This program was orignally developed by Kurt D. Zeilenga for inclusion in - * OpenLDAP Software. + * This program was orignally developed by Kurt D. Zeilenga for inclusion + * in OpenLDAP Software. + */ + +/* + * LDAPv3 Transactions (draft-zeilenga-ldap-txn) */ #include "portable.h" +#include #include -#include +#include #include +#include #include "ldap-int.h" +#include "ldap_log.h" -#ifdef LDAP_GROUP_TRANSACTION +#ifdef LDAP_X_TXN +int +ldap_txn_start( + LDAP *ld, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp ) +{ + return ldap_extended_operation( ld, LDAP_EXOP_X_TXN_START, + NULL, sctrls, cctrls, msgidp ); +} int -ldap_txn_create_s( +ldap_txn_start_s( LDAP *ld, - struct berval **cookie, - LDAPControl **sctrls, - LDAPControl **cctrls ) + LDAPControl **sctrls, + LDAPControl **cctrls, + struct berval **txnid ) { - return LDAP_NOT_SUPPORTED; + assert( txnid != NULL ); + + return ldap_extended_operation_s( ld, LDAP_EXOP_X_TXN_START, + NULL, sctrls, cctrls, NULL, txnid ); } int -ldap_txn_end_s( +ldap_txn_end( LDAP *ld, - struct berval *cookie, - int commit, - LDAPControl **sctrls, - LDAPControl **cctrls ) + int commit, + struct berval *txnid, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *msgidp ) { - return LDAP_NOT_SUPPORTED; + int rc; + BerElement *txnber = NULL; + struct berval *txnval = NULL; + + assert( txnid != NULL ); + + txnber = ber_alloc_t( LBER_USE_DER ); + + if( commit ) { + ber_printf( txnber, "{ON}", txnid ); + } else { + ber_printf( txnber, "{bON}", commit, txnid ); + } + + ber_flatten( txnber, &txnval ); + + rc = ldap_extended_operation( ld, LDAP_EXOP_X_TXN_END, + txnval, sctrls, cctrls, msgidp ); + + ber_free( txnber, 1 ); + return rc; } +int +ldap_txn_end_s( + LDAP *ld, + int commit, + struct berval *txnid, + LDAPControl **sctrls, + LDAPControl **cctrls, + int *retidp ) +{ + 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, "{ON}", txnid ); + } else { + 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, &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; +} #endif