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