119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * uuid_time.c --- Interpret the time field from a uuid.  This program
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 	violates the UUID abstraction barrier by reaching into the guts
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *	of a UUID and interpreting it.
53984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1998, 1999 Theodore Ts'o.
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header%
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Redistribution and use in source and binary forms, with or without
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * modification, are permitted provided that the following conditions
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * are met:
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *    notice, and the entire permission notice in its entirety,
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *    including the disclaimer of warranties.
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *    documentation and/or other materials provided with the distribution.
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 3. The name of the author may not be used to endorse or promote
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *    products derived from this software without specific prior
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *    written permission.
213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * DAMAGE.
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header%
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef _WIN32
383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define _WIN32_WINNT 0x0500
393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#include <windows.h>
403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define UUID MYUUID
413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif
423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef HAVE_UNISTD_H
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h>
463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h>
493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef HAVE_SYS_TIME_H
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/time.h>
513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h>
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "uuidP.h"
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecttime_t uuid_time(const uuid_t uu, struct timeval *ret_tv)
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct timeval		tv;
593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	struct uuid		uuid;
603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	uint32_t		high;
613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	uint64_t		clock_reg;
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	uuid_unpack(uu, &uuid);
643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	high = uuid.time_mid | ((uuid.time_hi_and_version & 0xFFF) << 16);
663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	clock_reg = uuid.time_low | ((uint64_t) high << 32);
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	clock_reg -= (((uint64_t) 0x01B21DD2) << 32) + 0x13814000;
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	tv.tv_sec = clock_reg / 10000000;
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	tv.tv_usec = (clock_reg % 10000000) / 10;
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ret_tv)
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		*ret_tv = tv;
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return tv.tv_sec;
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint uuid_type(const uuid_t uu)
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct uuid		uuid;
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	uuid_unpack(uu, &uuid);
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return ((uuid.time_hi_and_version >> 12) & 0xF);
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint uuid_variant(const uuid_t uu)
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct uuid		uuid;
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int			var;
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt	uuid_unpack(uu, &uuid);
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	var = uuid.clock_seq;
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if ((var & 0x8000) == 0)
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return UUID_VARIANT_NCS;
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if ((var & 0x4000) == 0)
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return UUID_VARIANT_DCE;
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if ((var & 0x2000) == 0)
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return UUID_VARIANT_MICROSOFT;
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return UUID_VARIANT_OTHER;
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic const char *variant_string(int variant)
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	switch (variant) {
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	case UUID_VARIANT_NCS:
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return "NCS";
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	case UUID_VARIANT_DCE:
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return "DCE";
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	case UUID_VARIANT_MICROSOFT:
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return "Microsoft";
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	default:
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return "Other";
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmain(int argc, char **argv)
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	uuid_t		buf;
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	time_t		time_reg;
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct timeval	tv;
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		type, variant;
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (argc != 2) {
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		fprintf(stderr, "Usage: %s uuid\n", argv[0]);
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (uuid_parse(argv[1], buf)) {
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		fprintf(stderr, "Invalid UUID: %s\n", argv[1]);
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	variant = uuid_variant(buf);
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	type = uuid_type(buf);
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	time_reg = uuid_time(buf, &tv);
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("UUID variant is %d (%s)\n", variant, variant_string(variant));
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (variant != UUID_VARIANT_DCE) {
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf("Warning: This program only knows how to interpret "
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		       "DCE UUIDs.\n\tThe rest of the output is likely "
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		       "to be incorrect!!\n");
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("UUID type is %d", type);
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	switch (type) {
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	case 1:
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf(" (time based)\n");
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		break;
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	case 2:
15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf(" (DCE)\n");
15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		break;
15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	case 3:
15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf(" (name-based)\n");
15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		break;
15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	case 4:
15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf(" (random)\n");
15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		break;
15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	default:
16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf("\n");
16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (type != 1) {
16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf("Warning: not a time-based UUID, so UUID time "
16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		       "decoding will likely not work!\n");
16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("UUID time is: (%ld, %ld): %s\n", tv.tv_sec, tv.tv_usec,
16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       ctime(&time_reg));
1683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
172