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