No empty .Rs/.Re
[netbsd-mini2440.git] / external / bsd / openldap / dist / libraries / libldap / txn.c
blob79644be144d25fd32f51d8409a77c038340d1327
1 /* $OpenLDAP: pkg/ldap/libraries/libldap/txn.c,v 1.8.2.3 2008/02/11 23:26:41 kurt Exp $ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 2006-2008 The OpenLDAP Foundation.
5 * All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted only as authorized by the OpenLDAP
9 * Public License.
11 * A copy of this license is available in the file LICENSE in the
12 * top-level directory of the distribution or, alternatively, at
13 * <http://www.OpenLDAP.org/license.html>.
15 /* ACKNOWLEDGEMENTS:
16 * This program was orignally developed by Kurt D. Zeilenga for inclusion
17 * in OpenLDAP Software.
21 * LDAPv3 Transactions (draft-zeilenga-ldap-txn)
24 #include "portable.h"
26 #include <stdio.h>
27 #include <ac/stdlib.h>
29 #include <ac/socket.h>
30 #include <ac/string.h>
31 #include <ac/time.h>
33 #include "ldap-int.h"
34 #include "ldap_log.h"
36 #ifdef LDAP_X_TXN
37 int
38 ldap_txn_start(
39 LDAP *ld,
40 LDAPControl **sctrls,
41 LDAPControl **cctrls,
42 int *msgidp )
44 return ldap_extended_operation( ld, LDAP_EXOP_X_TXN_START,
45 NULL, sctrls, cctrls, msgidp );
48 int
49 ldap_txn_start_s(
50 LDAP *ld,
51 LDAPControl **sctrls,
52 LDAPControl **cctrls,
53 struct berval **txnid )
55 assert( txnid != NULL );
57 return ldap_extended_operation_s( ld, LDAP_EXOP_X_TXN_START,
58 NULL, sctrls, cctrls, NULL, txnid );
61 int
62 ldap_txn_end(
63 LDAP *ld,
64 int commit,
65 struct berval *txnid,
66 LDAPControl **sctrls,
67 LDAPControl **cctrls,
68 int *msgidp )
70 int rc;
71 BerElement *txnber = NULL;
72 struct berval *txnval = NULL;
74 assert( txnid != NULL );
76 txnber = ber_alloc_t( LBER_USE_DER );
78 if( commit ) {
79 ber_printf( txnber, "{ON}", txnid );
80 } else {
81 ber_printf( txnber, "{bON}", commit, txnid );
84 ber_flatten( txnber, &txnval );
86 rc = ldap_extended_operation( ld, LDAP_EXOP_X_TXN_END,
87 txnval, sctrls, cctrls, msgidp );
89 ber_free( txnber, 1 );
90 return rc;
93 int
94 ldap_txn_end_s(
95 LDAP *ld,
96 int commit,
97 struct berval *txnid,
98 LDAPControl **sctrls,
99 LDAPControl **cctrls,
100 int *retidp )
102 int rc;
103 BerElement *txnber = NULL;
104 struct berval *txnval = NULL;
105 struct berval *retdata = NULL;
107 if ( retidp != NULL ) *retidp = -1;
109 txnber = ber_alloc_t( LBER_USE_DER );
111 if( commit ) {
112 ber_printf( txnber, "{ON}", txnid );
113 } else {
114 ber_printf( txnber, "{bON}", commit, txnid );
117 ber_flatten( txnber, &txnval );
119 rc = ldap_extended_operation_s( ld, LDAP_EXOP_X_TXN_END,
120 txnval, sctrls, cctrls, NULL, &retdata );
122 ber_free( txnber, 1 );
124 /* parse retdata */
125 if( retdata != NULL ) {
126 BerElement *ber;
127 ber_tag_t tag;
128 ber_int_t retid;
130 if( retidp == NULL ) goto done;
132 ber = ber_init( retdata );
134 if( ber == NULL ) {
135 rc = ld->ld_errno = LDAP_NO_MEMORY;
136 goto done;
139 tag = ber_scanf( ber, "i", &retid );
140 ber_free( ber, 1 );
142 if ( tag != LBER_INTEGER ) {
143 rc = ld->ld_errno = LDAP_DECODING_ERROR;
144 goto done;
147 *retidp = (int) retid;
149 done:
150 ber_bvfree( retdata );
153 return rc;
155 #endif