| /* vi: set sw=4 ts=4: */ |
| /* |
| * 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; |
| } |