78 lines
1.4 KiB
C
78 lines
1.4 KiB
C
|
/*
|
||
|
* uuid.c -- utility routines for manipulating UUID's.
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <ext2fs/ext2_types.h>
|
||
|
|
||
|
#include "e2p.h"
|
||
|
|
||
|
struct uuid {
|
||
|
__u32 time_low;
|
||
|
__u16 time_mid;
|
||
|
__u16 time_hi_and_version;
|
||
|
__u16 clock_seq;
|
||
|
__u8 node[6];
|
||
|
};
|
||
|
|
||
|
/* Returns 1 if the uuid is the NULL uuid */
|
||
|
int e2p_is_null_uuid(void *uu)
|
||
|
{
|
||
|
__u8 *cp;
|
||
|
int i;
|
||
|
|
||
|
for (i=0, cp = uu; i < 16; i++)
|
||
|
if (*cp)
|
||
|
return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
static void e2p_unpack_uuid(void *in, struct uuid *uu)
|
||
|
{
|
||
|
__u8 *ptr = in;
|
||
|
__u32 tmp;
|
||
|
|
||
|
tmp = *ptr++;
|
||
|
tmp = (tmp << 8) | *ptr++;
|
||
|
tmp = (tmp << 8) | *ptr++;
|
||
|
tmp = (tmp << 8) | *ptr++;
|
||
|
uu->time_low = tmp;
|
||
|
|
||
|
tmp = *ptr++;
|
||
|
tmp = (tmp << 8) | *ptr++;
|
||
|
uu->time_mid = tmp;
|
||
|
|
||
|
tmp = *ptr++;
|
||
|
tmp = (tmp << 8) | *ptr++;
|
||
|
uu->time_hi_and_version = tmp;
|
||
|
|
||
|
tmp = *ptr++;
|
||
|
tmp = (tmp << 8) | *ptr++;
|
||
|
uu->clock_seq = tmp;
|
||
|
|
||
|
memcpy(uu->node, ptr, 6);
|
||
|
}
|
||
|
|
||
|
void e2p_uuid_to_str(void *uu, char *out)
|
||
|
{
|
||
|
struct uuid uuid;
|
||
|
|
||
|
e2p_unpack_uuid(uu, &uuid);
|
||
|
sprintf(out,
|
||
|
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||
|
uuid.time_low, uuid.time_mid, uuid.time_hi_and_version,
|
||
|
uuid.clock_seq >> 8, uuid.clock_seq & 0xFF,
|
||
|
uuid.node[0], uuid.node[1], uuid.node[2],
|
||
|
uuid.node[3], uuid.node[4], uuid.node[5]);
|
||
|
}
|
||
|
|
||
|
const char *e2p_uuid2str(void *uu)
|
||
|
{
|
||
|
static char buf[80];
|
||
|
if (e2p_is_null_uuid(uu))
|
||
|
return "<none>";
|
||
|
e2p_uuid_to_str(uu, buf);
|
||
|
return buf;
|
||
|
}
|