1 /* ldapsync.c -- LDAP Content Sync Routines */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 * Copyright 2003-2005 The OpenLDAP Foundation.
6 * Portions Copyright 2003 IBM Corporation.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted only as authorized by the OpenLDAP
13 * A copy of this license is available in the file LICENSE in the
14 * top-level directory of the distribution or, alternatively, at
15 * <http://www.OpenLDAP.org/license.html>.
22 #include <ac/string.h>
23 #include <ac/socket.h>
27 #include "../../libraries/liblber/lber-int.h" /* get ber_strndup() */
28 #include "lutil_ldap.h"
31 struct sync_cookie *slap_sync_cookie = NULL;
33 struct slap_sync_cookie_s slap_sync_cookie =
34 LDAP_STAILQ_HEAD_INITIALIZER( slap_sync_cookie );
38 slap_compose_sync_cookie(
40 struct berval *cookie,
45 char cookiestr[ LDAP_LUTIL_CSNSTR_BUFSIZE + 20 ];
47 if ( csn->bv_val == NULL ) {
52 snprintf( cookiestr, LDAP_LUTIL_CSNSTR_BUFSIZE + 20,
57 snprintf( cookiestr, LDAP_LUTIL_CSNSTR_BUFSIZE + 20,
60 snprintf( cookiestr, LDAP_LUTIL_CSNSTR_BUFSIZE + 20,
61 "sid=%03d,rid=%03d", sid, rid );
67 snprintf( cookiestr, LDAP_LUTIL_CSNSTR_BUFSIZE + 20,
68 "csn=%s", csn->bv_val );
70 snprintf( cookiestr, LDAP_LUTIL_CSNSTR_BUFSIZE + 20,
71 "csn=%s,rid=%03d", csn->bv_val, rid );
75 snprintf( cookiestr, LDAP_LUTIL_CSNSTR_BUFSIZE + 20,
76 "csn=%s,sid=%03d", csn->bv_val, sid );
78 snprintf( cookiestr, LDAP_LUTIL_CSNSTR_BUFSIZE + 20,
79 "csn=%s,sid=%03d,rid=%03d", csn->bv_val, sid, rid );
83 ber_str2bv( cookiestr, strlen(cookiestr), 1, cookie );
87 slap_sync_cookie_free(
88 struct sync_cookie *cookie,
95 if ( cookie->ctxcsn ) {
96 ber_bvarray_free( cookie->ctxcsn );
97 cookie->ctxcsn = NULL;
100 if ( cookie->octet_str ) {
101 ber_bvarray_free( cookie->octet_str );
102 cookie->octet_str = NULL;
113 slap_parse_sync_cookie(
114 struct sync_cookie *cookie
126 struct berval ctxcsn;
128 if ( cookie == NULL )
131 while (( csn_ptr = strstr( cookie->octet_str[0].bv_val, "csn=" )) != NULL ) {
132 AttributeDescription *ad = slap_schema.si_ad_modifyTimestamp;
133 slap_syntax_validate_func *validate;
136 csn_str = csn_ptr + STRLENOF("csn=");
137 cval = strchr( csn_str, ',' );
139 csn_str_len = cval - csn_str;
143 /* FIXME use csnValidate when it gets implemented */
144 csn_ptr = strchr( csn_str, '#' );
145 if ( !csn_ptr ) break;
147 stamp.bv_val = csn_str;
148 stamp.bv_len = csn_ptr - csn_str;
149 validate = ad->ad_type->sat_syntax->ssyn_validate;
150 if ( validate( ad->ad_type->sat_syntax, &stamp ) != LDAP_SUCCESS )
156 ber_str2bv( csn_str, csn_str_len, 1, &ctxcsn );
157 ber_bvarray_add( &cookie->ctxcsn, &ctxcsn );
159 cookie->ctxcsn = NULL;
162 if (( sid_ptr = strstr( cookie->octet_str->bv_val, "sid=" )) != NULL ) {
163 sid_str = SLAP_STRNDUP( sid_ptr,
164 SLAP_SYNC_SID_SIZE + sizeof("sid=") - 1 );
165 if ( (cval = strchr( sid_str, ',' )) != NULL ) {
168 cookie->sid = atoi( sid_str + sizeof("sid=") - 1 );
174 if (( rid_ptr = strstr( cookie->octet_str->bv_val, "rid=" )) != NULL ) {
175 rid_str = SLAP_STRNDUP( rid_ptr,
176 SLAP_SYNC_RID_SIZE + sizeof("rid=") - 1 );
177 if ( (cval = strchr( rid_str, ',' )) != NULL ) {
180 cookie->rid = atoi( rid_str + sizeof("rid=") - 1 );
189 slap_init_sync_cookie_ctxcsn(
190 struct sync_cookie *cookie
193 char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE + 4 ];
194 struct berval octet_str = BER_BVNULL;
195 struct berval ctxcsn = BER_BVNULL;
196 struct berval ctxcsn_dup = BER_BVNULL;
197 struct berval slap_syncCookie;
199 if ( cookie == NULL )
202 octet_str.bv_len = snprintf( csnbuf, LDAP_LUTIL_CSNSTR_BUFSIZE + 4,
203 "csn=%4d%02d%02d%02d%02d%02dZ#%06x#%02x#%06x",
204 1900, 1, 1, 0, 0, 0, 0, 0, 0 );
205 octet_str.bv_val = csnbuf;
206 build_new_dn( &slap_syncCookie, &cookie->octet_str[0], &octet_str, NULL );
207 ber_bvarray_free( cookie->octet_str );
208 cookie->octet_str = NULL;
209 ber_bvarray_add( &cookie->octet_str, &slap_syncCookie );
211 ctxcsn.bv_val = octet_str.bv_val + 4;
212 ctxcsn.bv_len = octet_str.bv_len - 4;
213 ber_dupbv( &ctxcsn_dup, &ctxcsn );
214 ber_bvarray_add( &cookie->ctxcsn, &ctxcsn_dup );
220 slap_dup_sync_cookie(
221 struct sync_cookie *dst,
222 struct sync_cookie *src
226 struct sync_cookie *new;
227 struct berval tmp_bv;
233 ber_bvarray_free( dst->ctxcsn );
234 ber_bvarray_free( dst->octet_str );
237 new = ( struct sync_cookie * )
238 ch_calloc( 1, sizeof( struct sync_cookie ));
245 for ( i=0; src->ctxcsn[i].bv_val; i++ ) {
246 ber_dupbv( &tmp_bv, &src->ctxcsn[i] );
247 ber_bvarray_add( &new->ctxcsn, &tmp_bv );
251 if ( src->octet_str ) {
252 for ( i=0; src->octet_str[i].bv_val; i++ ) {
253 ber_dupbv( &tmp_bv, &src->octet_str[i] );
254 ber_bvarray_add( &new->octet_str, &tmp_bv );