paul@181 | 1 | /* |
paul@181 | 2 | * uuid.c -- utility routines for manipulating UUID's. |
paul@181 | 3 | * |
paul@181 | 4 | * %Begin-Header% |
paul@181 | 5 | * This file may be redistributed under the terms of the GNU Library |
paul@181 | 6 | * General Public License, version 2. |
paul@181 | 7 | * %End-Header% |
paul@181 | 8 | */ |
paul@181 | 9 | |
paul@181 | 10 | #include "config.h" |
paul@181 | 11 | #include <stdio.h> |
paul@181 | 12 | #include <string.h> |
paul@181 | 13 | #include <ext2fs/ext2_types.h> |
paul@181 | 14 | |
paul@181 | 15 | #include "e2p.h" |
paul@181 | 16 | |
paul@181 | 17 | struct uuid { |
paul@181 | 18 | __u32 time_low; |
paul@181 | 19 | __u16 time_mid; |
paul@181 | 20 | __u16 time_hi_and_version; |
paul@181 | 21 | __u16 clock_seq; |
paul@181 | 22 | __u8 node[6]; |
paul@181 | 23 | }; |
paul@181 | 24 | |
paul@181 | 25 | /* Returns 1 if the uuid is the NULL uuid */ |
paul@181 | 26 | int e2p_is_null_uuid(void *uu) |
paul@181 | 27 | { |
paul@181 | 28 | __u8 *cp; |
paul@181 | 29 | int i; |
paul@181 | 30 | |
paul@181 | 31 | for (i=0, cp = uu; i < 16; i++) |
paul@181 | 32 | if (*cp++) |
paul@181 | 33 | return 0; |
paul@181 | 34 | return 1; |
paul@181 | 35 | } |
paul@181 | 36 | |
paul@181 | 37 | static void e2p_unpack_uuid(void *in, struct uuid *uu) |
paul@181 | 38 | { |
paul@181 | 39 | __u8 *ptr = in; |
paul@181 | 40 | __u32 tmp; |
paul@181 | 41 | |
paul@181 | 42 | tmp = *ptr++; |
paul@181 | 43 | tmp = (tmp << 8) | *ptr++; |
paul@181 | 44 | tmp = (tmp << 8) | *ptr++; |
paul@181 | 45 | tmp = (tmp << 8) | *ptr++; |
paul@181 | 46 | uu->time_low = tmp; |
paul@181 | 47 | |
paul@181 | 48 | tmp = *ptr++; |
paul@181 | 49 | tmp = (tmp << 8) | *ptr++; |
paul@181 | 50 | uu->time_mid = tmp; |
paul@181 | 51 | |
paul@181 | 52 | tmp = *ptr++; |
paul@181 | 53 | tmp = (tmp << 8) | *ptr++; |
paul@181 | 54 | uu->time_hi_and_version = tmp; |
paul@181 | 55 | |
paul@181 | 56 | tmp = *ptr++; |
paul@181 | 57 | tmp = (tmp << 8) | *ptr++; |
paul@181 | 58 | uu->clock_seq = tmp; |
paul@181 | 59 | |
paul@181 | 60 | memcpy(uu->node, ptr, 6); |
paul@181 | 61 | } |
paul@181 | 62 | |
paul@181 | 63 | void e2p_uuid_to_str(void *uu, char *out) |
paul@181 | 64 | { |
paul@181 | 65 | struct uuid uuid; |
paul@181 | 66 | |
paul@181 | 67 | e2p_unpack_uuid(uu, &uuid); |
paul@181 | 68 | sprintf(out, |
paul@181 | 69 | "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", |
paul@181 | 70 | uuid.time_low, uuid.time_mid, uuid.time_hi_and_version, |
paul@181 | 71 | uuid.clock_seq >> 8, uuid.clock_seq & 0xFF, |
paul@181 | 72 | uuid.node[0], uuid.node[1], uuid.node[2], |
paul@181 | 73 | uuid.node[3], uuid.node[4], uuid.node[5]); |
paul@181 | 74 | } |
paul@181 | 75 | |
paul@181 | 76 | const char *e2p_uuid2str(void *uu) |
paul@181 | 77 | { |
paul@181 | 78 | static char buf[80]; |
paul@181 | 79 | |
paul@181 | 80 | if (e2p_is_null_uuid(uu)) |
paul@181 | 81 | return "<none>"; |
paul@181 | 82 | e2p_uuid_to_str(uu, buf); |
paul@181 | 83 | return buf; |
paul@181 | 84 | } |
paul@181 | 85 | |