#include "hex-binary.h"
#include "hostpid.h"
#include "guid.h"
+#include "randgen.h"
#include <unistd.h>
#include <time.h>
memcpy(guid_r + 8, guid_static, 8);
}
+void guid_128_uuid4_generate(guid_128_t uuid)
+{
+ random_fill(uuid, sizeof(guid_128_t));
+ uuid[6] = (uuid[6] & 0x0F) | 0x40; /* Set version 4 */
+ uuid[8] = (uuid[8] & 0xBF) | 0x80; /* Set variant 2 (first 2 bits to 10) */
+}
+
bool guid_128_is_empty(const guid_128_t guid)
{
unsigned int i;
ARRAY_DEFINE_TYPE(guid_128_t, guid_128_t);
+/* Very liberal check, checks only version. */
+#define GUID_128_IS_UUID4(uuid) \
+ (((uuid)[6] & 0xF0) == 0x40)
+
enum uuid_format {
FORMAT_RECORD,
FORMAT_COMPACT,
const char *guid_generate(void);
/* Generate 128 bit GUID */
void guid_128_generate(guid_128_t guid_r);
+/* Generate UUID4gen1 */
+void guid_128_uuid4_generate(guid_128_t guid_r);
+
/* Returns TRUE if GUID is empty (not set / unknown). */
bool guid_128_is_empty(const guid_128_t guid) ATTR_PURE;
static inline void guid_128_empty(guid_128_t guid)
0xab, 0xcd, 0xef,
0xAB, 0xCD, 0xEF,
0x00, 0x00, 0x00, 0x00, 0x00 };
- guid_128_t guid1, guid2, guid3;
+ guid_128_t guid1, guid2, guid3, guid_empty;
const char *str;
char guidbuf[GUID_128_SIZE*2 + 2];
unsigned int i;
guidbuf[0] = ' ';
test_assert(guid_128_from_string(guidbuf, guid3) < 0);
+ test_assert(guid_128_from_uuid_string("00000000-0000-0000-0000-000000000000", guid_empty) == 0);
+ test_assert(guid_128_is_empty(guid_empty));
test_assert(guid_128_from_uuid_string("fee0ceac-0327-11e7-ad39-52540078f374", guid3) == 0);
test_assert(guid_128_from_uuid_string("fee0ceac032711e7ad3952540078f374", guid2) == 0);
test_assert(guid_128_cmp(guid3, guid2) == 0);
/* failure test */
test_assert(guid_128_from_uuid_string("fe-e0ceac-0327-11e7-ad39-52540078f374", guid3) < 0);
+ /* UUIDv4 */
+ guid_128_t uuidv4;
+ guid_128_uuid4_generate(uuidv4);
+ test_assert((uuidv4[6] & 0xF0) == 0x40);
+ test_assert((uuidv4[8] & 0xC0) == 0x80);
+
test_end();
test_ioloop_guid_128_generate();