]>
git.saurik.com Git - apple/xnu.git/blob - libkern/uuid/uuid.c
2 * Copyright (c) 2004-2010 Apple Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, and the entire permission notice in its entirety,
10 * including the disclaimer of warranties.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote
15 * products derived from this software without specific prior
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
19 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
21 * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
28 * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
33 #include <uuid/uuid.h>
38 #include <sys/random.h>
39 #include <sys/socket.h>
40 #include <sys/systm.h>
44 #include <net/if_dl.h>
45 #include <net/if_types.h>
47 UUID_DEFINE(UUID_NULL
, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
50 read_node(uint8_t *node
)
54 struct sockaddr_dl
*sdl
;
56 ifnet_head_lock_shared();
57 TAILQ_FOREACH(ifp
, &ifnet_head
, if_link
) {
58 ifnet_lock_shared(ifp
);
59 IFA_LOCK_SPIN(ifp
->if_lladdr
);
60 sdl
= (struct sockaddr_dl
*)ifp
->if_lladdr
->ifa_addr
;
61 if (sdl
->sdl_type
== IFT_ETHER
) {
62 memcpy(node
, LLADDR(sdl
), 6);
63 IFA_UNLOCK(ifp
->if_lladdr
);
68 IFA_UNLOCK(ifp
->if_lladdr
);
72 #endif /* NETWORKING */
85 return (tv
.tv_sec
* 10000000ULL) + (tv
.tv_nsec
/ 100ULL) + 0x01B21DD213814000ULL
;
91 memset(uu
, 0, sizeof(uuid_t
));
95 uuid_compare(const uuid_t uu1
, const uuid_t uu2
)
97 return memcmp(uu1
, uu2
, sizeof(uuid_t
));
101 uuid_copy(uuid_t dst
, const uuid_t src
)
103 memcpy(dst
, src
, sizeof(uuid_t
));
107 uuid_generate_random(uuid_t out
)
109 read_random(out
, sizeof(uuid_t
));
111 out
[6] = (out
[6] & 0x0F) | 0x40;
112 out
[8] = (out
[8] & 0x3F) | 0x80;
116 uuid_generate_time(uuid_t out
)
121 read_random(&out
[8], 2);
124 out
[0] = (uint8_t)(time
>> 24);
125 out
[1] = (uint8_t)(time
>> 16);
126 out
[2] = (uint8_t)(time
>> 8);
127 out
[3] = (uint8_t)time
;
128 out
[4] = (uint8_t)(time
>> 40);
129 out
[5] = (uint8_t)(time
>> 32);
130 out
[6] = (uint8_t)(time
>> 56);
131 out
[7] = (uint8_t)(time
>> 48);
133 out
[6] = (out
[6] & 0x0F) | 0x10;
134 out
[8] = (out
[8] & 0x3F) | 0x80;
138 uuid_generate(uuid_t out
)
140 uuid_generate_random(out
);
144 uuid_is_null(const uuid_t uu
)
146 return !memcmp(uu
, UUID_NULL
, sizeof(uuid_t
));
150 uuid_parse(const uuid_string_t in
, uuid_t uu
)
155 "%2hhx%2hhx%2hhx%2hhx-"
159 "%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%n",
160 &uu
[0], &uu
[1], &uu
[2], &uu
[3],
164 &uu
[10], &uu
[11], &uu
[12], &uu
[13], &uu
[14], &uu
[15], &n
);
166 return (n
!= 36 || in
[n
] != '\0' ? -1 : 0);
170 uuid_unparse_lower(const uuid_t uu
, uuid_string_t out
)
173 sizeof(uuid_string_t
),
178 "%02x%02x%02x%02x%02x%02x",
179 uu
[0], uu
[1], uu
[2], uu
[3],
183 uu
[10], uu
[11], uu
[12], uu
[13], uu
[14], uu
[15]);
187 uuid_unparse_upper(const uuid_t uu
, uuid_string_t out
)
190 sizeof(uuid_string_t
),
195 "%02X%02X%02X%02X%02X%02X",
196 uu
[0], uu
[1], uu
[2], uu
[3],
200 uu
[10], uu
[11], uu
[12], uu
[13], uu
[14], uu
[15]);
204 uuid_unparse(const uuid_t uu
, uuid_string_t out
)
206 uuid_unparse_upper(uu
, out
);