2 * Copyright (c) 2012 Your File System Inc. All rights reserved.
10 #ifdef HAVE_UUID_UUID_H
11 # include <uuid/uuid.h>
18 #include <hcrypto/rand.h>
23 static const opr_uuid_t nilUid = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
26 opr_uuid_create(opr_uuid_t *uuid)
28 #if defined (AFS_NT40_ENV)
29 struct opr_uuid_unpacked raw;
31 UuidCreate((UUID *) &raw);
32 opr_uuid_pack(uuid, &raw);
34 #elif !defined(KERNEL) && defined(HAVE_UUID_GENERATE)
36 uuid_generate(uuid->data);
39 RAND_bytes(uuid->data, 16);
41 uuid->data[6] = (uuid->data[6] & 0x0F) | 0x40; /* verison is 4 */
42 uuid->data[8] = (uuid->data[8] & 0x3F) | 0x80; /* variant is DCE */
47 opr_uuid_isNil(const opr_uuid_t *uuid)
49 return opr_uuid_equal(uuid, &nilUid);
53 opr_uuid_equal(const opr_uuid_t *uuid1, const opr_uuid_t *uuid2)
55 return memcmp(uuid1, uuid2, sizeof(opr_uuid_t)) == 0;
59 opr_uuid_hash(const opr_uuid_t *uuid)
61 /* uuid->data is a (unsigned char *), so there's every danger that this
62 * may cause an unaligned access on some platforms */
63 return opr_jhash((const afs_uint32 *)uuid->data, 4, 0);
68 opr_uuid_toString(const opr_uuid_t *uuid, char **string)
70 unsigned const char *p;
74 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-"
75 "%02x%02x%02x%02x%02x%02x",
76 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
77 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
81 opr_uuid_freeString(char *string)
87 opr_uuid_fromString(opr_uuid_t *uuid, const char *string)
92 /* XXX - Traditionally, AFS has printed UUIDs as
93 * 00000000-0000-00-00-00000000. We should perhaps also accept
96 items = sscanf(string,
97 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-"
98 "%02x%02x%02x%02x%02x%02x",
99 &i[0], &i[1], &i[2], &i[3], &i[4], &i[5],
100 &i[6], &i[7], &i[8], &i[9], &i[10], &i[11],
101 &i[12], &i[13], &i[14], &i[15]);
103 /* Originally, AFS's printed UUIDs would take the form
104 * 00000000-0000-0000-00-00-00000000. Also handle this. */
105 items = sscanf(string,
106 "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x-%02x-"
107 "%02x%02x%02x%02x%02x%02x",
108 &i[0], &i[1], &i[2], &i[3], &i[4], &i[5],
109 &i[6], &i[7], &i[8], &i[9], &i[10], &i[11],
110 &i[12], &i[13], &i[14], &i[15]);
116 uuid->data[c] = i[c];
124 opr_uuid_pack(opr_uuid_t *uuid, const struct opr_uuid_unpacked *raw)
127 unsigned short shortval;
129 intval = htonl(raw->time_low);
130 memcpy(&uuid->data[0], &intval, sizeof(uint32_t));
132 shortval = htons(raw->time_mid);
133 memcpy(&uuid->data[4], &shortval, sizeof(uint16_t));
135 shortval = htons(raw->time_hi_and_version);
136 memcpy(&uuid->data[6], &shortval, sizeof(uint16_t));
138 uuid->data[8] = raw->clock_seq_hi_and_reserved;
139 uuid->data[9] = raw->clock_seq_low;
141 memcpy(&uuid->data[10], &raw->node, 6);
145 opr_uuid_unpack(const opr_uuid_t *uuid, struct opr_uuid_unpacked *raw)
148 unsigned short shortval;
150 memcpy(&intval, &uuid->data[0], sizeof(uint32_t));
151 raw->time_low = ntohl(intval);
153 memcpy(&shortval, &uuid->data[4], sizeof(uint16_t));
154 raw->time_mid = ntohs(shortval);
156 memcpy(&shortval, &uuid->data[6], sizeof(uint16_t));
157 raw->time_hi_and_version = ntohs(shortval);
159 raw->clock_seq_hi_and_reserved = uuid->data[8];
160 raw->clock_seq_low = uuid->data[9];
162 memcpy(&raw->node, &uuid->data[10], 6);