20 #include "gw-config.h" 32 #include <sys/types.h> 36 #ifdef HAVE_SYS_IOCTL_H 37 #include <sys/ioctl.h> 39 #ifdef HAVE_SYS_SOCKET_H 40 #include <sys/socket.h> 42 #ifdef HAVE_SYS_SOCKIO_H 43 #include <sys/sockio.h> 48 #ifdef HAVE_NETINET_IN_H 49 #include <netinet/in.h> 53 #include "gwlib/gw_uuid_types.h" 59 #define TIME_OFFSET_HIGH 0x01B21DD2 60 #define TIME_OFFSET_LOW 0x13814000 80 #define srand(x) srandom(x) 81 #define rand() random() 124 #define UUCMP(u1,u2) if (u1 != u2) return((u1 < u2) ? -1 : 1); 128 struct uuid uuid1, uuid2;
137 return memcmp(uuid1.
node, uuid2.
node, 6);
153 const unsigned char *cp2;
156 for (i=0, cp1 = dst, cp2 = src; i < 16; i++)
178 gettimeofday(&tv, 0);
179 fd = open(
"/dev/urandom", O_RDONLY);
181 fd = open(
"/dev/random", O_RDONLY | O_NONBLOCK);
182 srand((getpid() << 16) ^ getuid() ^ tv.tv_sec ^ tv.tv_usec);
185 gettimeofday(&tv, 0);
186 for (i = (tv.tv_sec ^ tv.tv_usec) & 0x1F; i > 0; i--)
200 int lose_counter = 0;
201 unsigned char *cp = (
unsigned char *) buf;
207 if (lose_counter++ > 16)
221 for (cp = buf, i = 0; i < nbytes; i++)
222 *cp++ ^= (
rand() >> 7) & 0xFF;
233 struct ifreq ifr, *ifrp;
247 #define max(a,b) ((a) > (b) ? (a) : (b)) 249 #define ifreq_size(i) max(sizeof(struct ifreq),\ 250 sizeof((i).ifr_name)+(i).ifr_addr.sa_len) 252 #define ifreq_size(i) sizeof(struct ifreq) 255 sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
259 memset(buf, 0,
sizeof(buf));
260 ifc.ifc_len =
sizeof(buf);
262 if (ioctl (sd, SIOCGIFCONF, (
char *)&ifc) < 0) {
267 for (i = 0; i < n; i+= ifreq_size(*ifr) ) {
268 ifrp = (
struct ifreq *)((
char *) ifc.ifc_buf+i);
269 strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ);
271 #if defined(SIOCGIFHWADDR) && !defined(__sun__) 272 if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0)
274 a = (
unsigned char *) &ifr.ifr_hwaddr.sa_data;
277 if (ioctl(sd, SIOCGENADDR, &ifr) < 0)
279 a = (
unsigned char *) ifr.ifr_enaddr;
289 if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5])
292 memcpy(node_id, a, 6);
303 #define MAX_ADJUSTMENT 10 305 static int get_clock(__u32 *clock_high, __u32 *clock_low, __u16 *ret_clock_seq)
307 static int adjustment = 0;
308 static struct timeval last = {0, 0};
309 static __u16 clock_seq;
311 unsigned long long clock_reg;
314 gettimeofday(&tv, 0);
315 if ((last.tv_sec == 0) && (last.tv_usec == 0)) {
321 if ((tv.tv_sec < last.tv_sec) ||
322 ((tv.tv_sec == last.tv_sec) &&
323 (tv.tv_usec < last.tv_usec))) {
324 clock_seq = (clock_seq+1) & 0x1FFF;
327 }
else if ((tv.tv_sec == last.tv_sec) &&
328 (tv.tv_usec == last.tv_usec)) {
337 clock_reg = tv.tv_usec*10 + adjustment;
338 clock_reg += ((
unsigned long long) tv.tv_sec)*10000000;
339 clock_reg += (((
unsigned long long) 0x01B21DD2) << 32) + 0x13814000;
341 *clock_high = clock_reg >> 32;
342 *clock_low = clock_reg;
343 *ret_clock_seq = clock_seq;
349 static unsigned char node_id[6];
350 static int has_init = 0;
370 memcpy(uu.
node, node_id, 6);
415 const unsigned char *cp;
418 for (i=0, cp = uu; i < 16; i++)
437 unsigned char *out = ptr;
440 out[3] = (
unsigned char) tmp;
442 out[2] = (
unsigned char) tmp;
444 out[1] = (
unsigned char) tmp;
446 out[0] = (
unsigned char) tmp;
449 out[5] = (
unsigned char) tmp;
451 out[4] = (
unsigned char) tmp;
454 out[7] = (
unsigned char) tmp;
456 out[6] = (
unsigned char) tmp;
459 out[9] = (
unsigned char) tmp;
461 out[8] = (
unsigned char) tmp;
463 memcpy(out+10, uu->
node, 6);
483 if (strlen(in) != 36)
485 for (i=0, cp = in; i <= 36; i++,cp++) {
486 if ((i == 8) || (i == 13) || (i == 18) ||
505 for (i=0; i < 6; i++) {
508 uuid.
node[i] = strtoul(buf, NULL, 16);
528 const __u8 *ptr = in;
532 tmp = (tmp << 8) | *ptr++;
533 tmp = (tmp << 8) | *ptr++;
534 tmp = (tmp << 8) | *ptr++;
538 tmp = (tmp << 8) | *ptr++;
542 tmp = (tmp << 8) | *ptr++;
546 tmp = (tmp << 8) | *ptr++;
549 memcpy(uu->
node, ptr, 6);
568 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
592 unsigned long long clock_reg;
597 clock_reg =
uuid.
time_low | ((
unsigned long long) high << 32);
599 clock_reg -= (((
unsigned long long) 0x01B21DD2) << 32) + 0x13814000;
600 tv.tv_sec = clock_reg / 10000000;
601 tv.tv_usec = (clock_reg % 10000000) / 10;
625 if ((var & 0x8000) == 0)
627 if ((var & 0x4000) == 0)
629 if ((var & 0x2000) == 0)
void uuid_generate_time(uuid_t out)
int uuid_type(const uuid_t uu)
static int get_clock(__u32 *clock_high, __u32 *clock_low, __u16 *ret_clock_seq)
int uuid_variant(const uuid_t uu)
void uuid_unparse(const uuid_t uu, char *out)
void uuid_generate(uuid_t out)
static int get_node_id(unsigned char *node_id)
__u16 time_hi_and_version
static void uuid_unpack(const uuid_t in, struct uuid *uu)
int uuid_parse(const char *in, uuid_t uu)
#define UUID_VARIANT_MICROSOFT
static void get_random_bytes(void *buf, int nbytes)
int uuid_is_null(const uuid_t uu)
void uuid_copy(uuid_t dst, const uuid_t src)
int uuid_compare(const uuid_t uu1, const uuid_t uu2)
static int get_random_fd(void)
time_t uuid_time(const uuid_t uu, struct timeval *ret_tv)
void uuid_generate_random(uuid_t out)
static void uuid_pack(const struct uuid *uu, uuid_t ptr)
#define UUID_VARIANT_OTHER
void uuid_clear(uuid_t uu)