X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fcsn.c;h=bab1dd9a8bd1261e7a1ad7f9ccbdfa6fd5421d82;hb=ced581bfa3f7029af4d3d743fa054922cf0a4e42;hp=0c95ccfef83a432c0d78920b74d70394b42413fa;hpb=72cfae72642fe3b636256ba68bc9e95982e9d13d;p=openldap diff --git a/libraries/liblutil/csn.c b/libraries/liblutil/csn.c index 0c95ccfef8..bab1dd9a8b 100644 --- a/libraries/liblutil/csn.c +++ b/libraries/liblutil/csn.c @@ -1,20 +1,32 @@ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* csn.c - Change Sequence Number routines */ +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2000-2007 The OpenLDAP Foundation. + * Portions Copyright 2000-2003 Kurt D. Zeilenga. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* Portions - * Copyright 2000, John E. Schimmel, All rights reserved. +/* Portions Copyright 2000, John E. Schimmel, All rights reserved. * This software is not subject to any license of Mirapoint, Inc. * * This is free software; you can redistribute and use it * under the same terms as OpenLDAP itself. */ -/* Adapted for incorporatation into OpenLDAP by Kurt Zeilenga */ +/* This work was developed by John E. Schimmel and adapted for + * inclusion in OpenLDAP Software by Kurt D. Zeilenga. + */ -/* - * This file contains routines to generate a change sequence number. Every - * add, delete, and modification is given a unique identifier for use in - * resolving conflicts during replication operations. +/* This file contains routines to generate a change sequence number. + * Every add, delete, and modification is given a unique identifier + * for use in resolving conflicts during replication operations. * * These routines are (loosly) based upon draft-ietf-ldup-model-03.txt, * A WORK IN PROGRESS. The format will likely change. @@ -23,8 +35,8 @@ * where s is a counter of operations within a timeslice, r is * the replica id (normally zero), and c is a counter of * modifications within this operation. s, r, and c are - * represented in hex and zero padded to lengths of 6, 2, and - * 6, respectively. + * represented in hex and zero padded to lengths of 6, 3, and + * 6, respectively. (In previous implementations r was only 2 digits.) * * Calls to this routine MUST be serialized with other calls * to gmtime(). @@ -39,26 +51,30 @@ size_t lutil_csnstr(char *buf, size_t len, unsigned int replica, unsigned int mod) { - static time_t csntime; + struct lutil_tm tm; static unsigned int csnop; + static int prev_sec, prev_usec; - time_t t; unsigned int op; - struct tm *ltm; int n; - time( &t ); - if ( t > csntime ) { - csntime = t; + lutil_gettime( &tm ); + + if ( tm.tm_sec > prev_sec || ( tm.tm_sec == prev_sec && + tm.tm_usec > prev_usec )) { + prev_sec = tm.tm_sec; + prev_usec = tm.tm_usec; csnop = 0; + } else { + tm.tm_sec = prev_sec; + tm.tm_usec = prev_usec; } - op = ++csnop; + op = csnop++; - ltm = gmtime( &t ); n = snprintf( buf, len, - "%4d%02d%02d%02d%02d%02dZ#%06x#%02x#%06x", - ltm->tm_year + 1900, ltm->tm_mon + 1, ltm->tm_mday, ltm->tm_hour, - ltm->tm_min, ltm->tm_sec, op, replica, mod ); + "%4d%02d%02d%02d%02d%02d.%06dZ#%06x#%03x#%06x", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, + tm.tm_min, tm.tm_sec, tm.tm_usec, op, replica, mod ); if( n < 0 ) return 0; return ( (size_t) n < len ) ? n : 0;