From: Kurt Zeilenga Date: Thu, 22 Aug 2002 02:25:45 +0000 (+0000) Subject: Fix month field X-Git-Tag: OPENLDAP_REL_ENG_2_1_4~9 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=391af545e8006bc2b4b3669730cbef5c44fdb2f4;p=openldap Fix month field --- diff --git a/libraries/liblutil/csn.c b/libraries/liblutil/csn.c new file mode 100644 index 0000000000..0a18918b3b --- /dev/null +++ b/libraries/liblutil/csn.c @@ -0,0 +1,77 @@ +/* + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ +/* 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 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 based upon draft-ietf-ldup-model-03.txt, and will + * need to be revisited once standardized. + * + * The format of a CSN string is: yyyymmddhh:mm:ssz#0xSSSS#d#0xssss + * where SSSS is a counter of operations within a timeslice, d is an + * offset into a list of replica records, and ssss is a counter of + * modifications within this operation. + * + * Calls to this routine MUST be serialized with other calls + * to gmtime(). + */ +#include "portable.h" + +#include +#include + +#include + +size_t +lutil_csnstr(char *buf, size_t len, unsigned int replica, unsigned int mod) +{ + static time_t csntime; + static unsigned int csnop; + + time_t t; + unsigned int op; + struct tm *ltm; + int n; + + time( &t ); + if ( t > csntime ) { + csntime = t; + csnop = 0; + } + op = ++csnop; + + ltm = gmtime( &t ); + n = snprintf( buf, len, "%4d%02d%02d%02d:%02d:%02dZ#0x%04x#%d#%04x", + ltm->tm_year + 1900, ltm->tm_mon + 1, ltm->tm_mday, ltm->tm_hour, + ltm->tm_min, ltm->tm_sec, op, replica, mod ); + + if( n < 0 ) return 0; + return ( (size_t) n < len ) ? n : 0; +} + +#ifdef TEST +int +main(int argc, char **argv) +{ + char buf[256]; + + if ( ! lutil_csnstr( buf, (size_t) 10, 0, 0 ) ) { + fprintf(stderr, "failed lutil_csnstr\n"); + } + if ( ! lutil_csnstr( buf, sizeof(buf), 0, 0 ) ) { + fprintf(stderr, "failed lutil_csnstr\n"); + } +} +#endif