11e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* 21e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * uuid.c -- utility routines for manipulating UUID's. 3543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * 4543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header% 5543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library 6543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2. 7543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header% 81e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 91e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 101e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include <stdio.h> 1121c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include <string.h> 12797f5ef14e92294b329e52971d467d7af5b2993eTheodore Ts'o#include <ext2fs/ext2_types.h> 131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 1421c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o#include "e2p.h" 1521c84b71e205b5ab13f14343da5645dcc985856dTheodore Ts'o 161e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ostruct uuid { 171e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u32 time_low; 181e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u16 time_mid; 191e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u16 time_hi_and_version; 201e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u16 clock_seq; 211e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u8 node[6]; 221e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o}; 231e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* Returns 1 if the uuid is the NULL uuid */ 251e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oint e2p_is_null_uuid(void *uu) 261e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{ 271e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u8 *cp; 281e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o int i; 291e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 301e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o for (i=0, cp = uu; i < 16; i++) 31b116e781f6ea9b16d88741e9f1b4a9d0448807faTheodore Ts'o if (*cp++) 321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o return 0; 331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o return 1; 341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o} 351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ostatic void e2p_unpack_uuid(void *in, struct uuid *uu) 371e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{ 381e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u8 *ptr = in; 391e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o __u32 tmp; 401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 411e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = *ptr++; 421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = (tmp << 8) | *ptr++; 431e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = (tmp << 8) | *ptr++; 441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = (tmp << 8) | *ptr++; 451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uu->time_low = tmp; 461e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 471e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = *ptr++; 481e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = (tmp << 8) | *ptr++; 491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uu->time_mid = tmp; 50efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 511e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = *ptr++; 521e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = (tmp << 8) | *ptr++; 531e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uu->time_hi_and_version = tmp; 541e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 551e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = *ptr++; 561e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp = (tmp << 8) | *ptr++; 571e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uu->clock_seq = tmp; 581e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 591e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o memcpy(uu->node, ptr, 6); 601e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o} 611e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 621e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ovoid e2p_uuid_to_str(void *uu, char *out) 631e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{ 641e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o struct uuid uuid; 651e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 661e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o e2p_unpack_uuid(uu, &uuid); 671e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o sprintf(out, 681e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", 691e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uuid.time_low, uuid.time_mid, uuid.time_hi_and_version, 701e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uuid.clock_seq >> 8, uuid.clock_seq & 0xFF, 711e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uuid.node[0], uuid.node[1], uuid.node[2], 721e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uuid.node[3], uuid.node[4], uuid.node[5]); 731e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o} 74f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 75f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'oconst char *e2p_uuid2str(void *uu) 76f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o{ 77f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o static char buf[80]; 78f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 79f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (e2p_is_null_uuid(uu)) 80f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return "<none>"; 81f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o e2p_uuid_to_str(uu, buf); 82f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return buf; 83f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o} 84f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 85