Index: ossp-pkg/uuid/uuid.c RCS File: /v/ossp/cvs/ossp-pkg/uuid/Attic/uuid.c,v rcsdiff -q -kk '-r1.19' '-r1.20' -u '/v/ossp/cvs/ossp-pkg/uuid/Attic/uuid.c,v' 2>/dev/null --- uuid.c 2004/01/10 21:54:52 1.19 +++ uuid.c 2004/01/10 22:18:48 1.20 @@ -478,14 +478,19 @@ (which in our case is 1us (= 1000ns) because we use gettimeofday(2) */ #define UUIDS_PER_TICK 10 -/* INTERNAL: generate UUID version 1, time part */ -static uuid_rc_t uuid_generate_v1_time(uuid_t *uuid, unsigned int mode, va_list ap) +/* INTERNAL: generate UUID version 1: time, clock and node based */ +static uuid_rc_t uuid_generate_v1(uuid_t *uuid, unsigned int mode, va_list ap) { struct timeval time_now; struct timeval tv; ui64_t t; ui64_t offset; ui64_t ov; + uuid_uint16_t clck; + + /* + * GENERATE TIME + */ /* determine current system time and sequence counter */ while (1) { @@ -495,15 +500,10 @@ /* check whether system time changed since last retrieve */ if (!( time_now.tv_sec == uuid->time_last.tv_sec - && time_now.tv_usec == uuid->time_last.tv_usec)) { + && time_now.tv_usec == uuid->time_last.tv_usec)) /* reset time sequence counter */ uuid->time_seq = 0; - /* remember system time for next iteration */ - uuid->time_last.tv_sec = time_now.tv_sec; - uuid->time_last.tv_usec = time_now.tv_usec; - } - /* until we are out of UUIDs per tick, increment the time/tick sequence counter and continue */ if (uuid->time_seq < UUIDS_PER_TICK) { @@ -555,19 +555,36 @@ uuid->obj.time_low = (uuid_uint32_t)(ui64_i2n(ov) & 0xffffffff); /* all 32 bit */ - return UUID_RC_OK; -} - -/* INTERNAL: generate UUID version 1, clock part */ -static uuid_rc_t uuid_generate_v1_clock(uuid_t *uuid, unsigned int mode, va_list ap) -{ - /* FIXME */ - return UUID_RC_OK; -} + /* + * GENERATE CLOCK + */ + + /* retrieve current clock sequence */ + clck = ((uuid->obj.clock_seq_hi_and_reserved & ~((0x03) << 6)) << 8) + + uuid->obj.clock_seq_low; + + /* generate new random clock sequence (initially or if the + time has stepped backwards) or else just increase it */ + if ( clck == 0 + || ( time_now.tv_sec < uuid->time_last.tv_sec + || ( time_now.tv_sec == uuid->time_last.tv_sec + && time_now.tv_usec < uuid->time_last.tv_usec))) + prng_data(uuid->prng, (void *)&clck, sizeof(clck)); + else + clck++; + clck &= ~((0x03) << 6); + + /* store back new clock sequence */ + uuid->obj.clock_seq_hi_and_reserved = + (uuid->obj.clock_seq_hi_and_reserved & ((0x03) << 6)) + | (uuid_uint8_t)((clck >> 8) & 0xff); + uuid->obj.clock_seq_low = + (uuid_uint8_t)(clck & 0xff); + + /* + * GENERATE NODE + */ -/* INTERNAL: generate UUID version 1, node part */ -static uuid_rc_t uuid_generate_v1_node(uuid_t *uuid, unsigned int mode, va_list ap) -{ if ((mode & UUID_MCASTRND) || (uuid->mac[0] & 0x80)) { /* use random multi-cast MAC address */ prng_data(uuid->prng, (void *)&(uuid->obj.node), sizeof(uuid->obj.node)); @@ -577,21 +594,14 @@ /* use real regular MAC address */ memcpy(uuid->obj.node, uuid->mac, sizeof(uuid->mac)); } - return UUID_RC_OK; -} - -/* INTERNAL: generate UUID version 1: time, clock and node based */ -static uuid_rc_t uuid_generate_v1(uuid_t *uuid, unsigned int mode, va_list ap) -{ - uuid_rc_t rc; - /* generate individual parts of v1 UUID */ - if ((rc = uuid_generate_v1_time (uuid, mode, ap)) != UUID_RC_OK) - return rc; - if ((rc = uuid_generate_v1_clock(uuid, mode, ap)) != UUID_RC_OK) - return rc; - if ((rc = uuid_generate_v1_node (uuid, mode, ap)) != UUID_RC_OK) - return rc; + /* + * FINISH + */ + + /* remember current system time for next iteration */ + uuid->time_last.tv_sec = time_now.tv_sec; + uuid->time_last.tv_usec = time_now.tv_usec; /* brand with version and variant */ uuid_brand(uuid, 1);