Module Name:    src
Committed By:   christos
Date:           Fri Oct  3 20:30:06 UTC 2014

Modified Files:
        src/sbin/gpt: biosboot.c create.c gpt_uuid.c gpt_uuid.h migrate.c

Log Message:
provide a copy of the kernel uuid generator (with portable API calls) for
tools.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sbin/gpt/biosboot.c
cvs rdiff -u -r1.11 -r1.12 src/sbin/gpt/create.c
cvs rdiff -u -r1.6 -r1.7 src/sbin/gpt/gpt_uuid.c
cvs rdiff -u -r1.2 -r1.3 src/sbin/gpt/gpt_uuid.h
cvs rdiff -u -r1.20 -r1.21 src/sbin/gpt/migrate.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/gpt/biosboot.c
diff -u src/sbin/gpt/biosboot.c:1.13 src/sbin/gpt/biosboot.c:1.14
--- src/sbin/gpt/biosboot.c:1.13	Thu Oct  2 15:15:21 2014
+++ src/sbin/gpt/biosboot.c	Fri Oct  3 16:30:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: biosboot.c,v 1.13 2014/10/02 19:15:21 joerg Exp $ */
+/*	$NetBSD: biosboot.c,v 1.14 2014/10/03 20:30:06 christos Exp $ */
 
 /*
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -37,13 +37,13 @@
 
 #include <sys/cdefs.h>
 #ifdef __RCSID
-__RCSID("$NetBSD: biosboot.c,v 1.13 2014/10/02 19:15:21 joerg Exp $");
+__RCSID("$NetBSD: biosboot.c,v 1.14 2014/10/03 20:30:06 christos Exp $");
 #endif
 
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/ioctl.h>
-#ifndef HAVE_NBTOOL_CONFIG_H
+#ifdef DIOCGWEDGEINFO
 #include <sys/disk.h>
 #endif
 #include <sys/param.h>

Index: src/sbin/gpt/create.c
diff -u src/sbin/gpt/create.c:1.11 src/sbin/gpt/create.c:1.12
--- src/sbin/gpt/create.c:1.11	Thu Oct  2 20:51:31 2014
+++ src/sbin/gpt/create.c	Fri Oct  3 16:30:06 2014
@@ -33,7 +33,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/create.c,v 1.11 2005/08/31 01:47:19 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: create.c,v 1.11 2014/10/03 00:51:31 jnemeth Exp $");
+__RCSID("$NetBSD: create.c,v 1.12 2014/10/03 20:30:06 christos Exp $");
 #endif
 
 #include <sys/types.h>
@@ -174,7 +174,7 @@ create(int fd)
 	hdr->hdr_lba_alt = htole64(last);
 	hdr->hdr_lba_start = htole64(tbl->map_start + blocks);
 	hdr->hdr_lba_end = htole64(last - blocks - 1LL);
-	gpt_uuid_create_new(hdr->hdr_guid);
+	gpt_uuid_generate(hdr->hdr_guid);
 	hdr->hdr_lba_table = htole64(tbl->map_start);
 	hdr->hdr_entries = htole32((blocks * secsz) / sizeof(struct gpt_ent));
 	if (le32toh(hdr->hdr_entries) > parts)
@@ -183,7 +183,7 @@ create(int fd)
 
 	ent = tbl->map_data;
 	for (i = 0; i < le32toh(hdr->hdr_entries); i++) {
-		gpt_uuid_create_new(ent[i].ent_guid);
+		gpt_uuid_generate(ent[i].ent_guid);
 	}
 
 	hdr->hdr_crc_table = htole32(crc32(ent, le32toh(hdr->hdr_entries) *

Index: src/sbin/gpt/gpt_uuid.c
diff -u src/sbin/gpt/gpt_uuid.c:1.6 src/sbin/gpt/gpt_uuid.c:1.7
--- src/sbin/gpt/gpt_uuid.c:1.6	Thu Oct  2 20:51:31 2014
+++ src/sbin/gpt/gpt_uuid.c	Fri Oct  3 16:30:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: gpt_uuid.c,v 1.6 2014/10/03 00:51:31 jnemeth Exp $	*/
+/*	$NetBSD: gpt_uuid.c,v 1.7 2014/10/03 20:30:06 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>
 #ifdef __RCSID
-__RCSID("$NetBSD: gpt_uuid.c,v 1.6 2014/10/03 00:51:31 jnemeth Exp $");
+__RCSID("$NetBSD: gpt_uuid.c,v 1.7 2014/10/03 20:30:06 christos Exp $");
 #endif
 
 #include <stdio.h>
@@ -44,10 +44,6 @@ __RCSID("$NetBSD: gpt_uuid.c,v 1.6 2014/
 #include <sys/endian.h>
 #endif
 
-#if !defined(HAVE_NBTOOL_CONFIG_H)
-#include <sys/types.h>
-#include <sys/uuid.h>
-#endif
 
 const gpt_uuid_t gpt_uuid_nil;
 
@@ -60,6 +56,12 @@ struct dce_uuid {
 	uint8_t		node[6];
 };
 
+struct kern_uuid {
+	uint64_t	ll;
+	uint16_t	seq;
+	uint8_t		node[6];
+};
+
 static const struct {
 	struct dce_uuid u;
 	const char *n;
@@ -237,12 +239,95 @@ gpt_uuid_create(gpt_type_t t, gpt_uuid_t
 }
 
 #if !defined(HAVE_NBTOOL_CONFIG_H)
-void
-gpt_uuid_create_new(gpt_uuid_t t)
+#include <sys/types.h>
+#include <sys/uuid.h>
+#else
+#include <time.h>
+/*
+ * Get the current time as a 5x bit count of 100000-microsecond intervals
+ * since 00:00:00.00, October 15,1582. We apply a magic offset to convert
+ * the Unix time since 00:00:00.00, January 1, 1970 to the date of the
+ * Gregorian reform to the Christian calendar.
+ */
+static uint64_t
+uuid_time(void)
+{
+	struct timeval tv;
+	uint64_t xtime = 0x01B21DD213814000LL;
+
+	(void)gettimeofday(&tv, NULL);
+	xtime += (uint64_t)tv.tv_sec * 10000000LL;
+	xtime += (uint64_t)(tv.tv_usec / 100000);
+	return (xtime & ((1LL << 60) - 1LL));
+}
+
+/*
+ * No portable way to get ethernet, use hostid instead
+ */
+static void
+uuid_node(uint8_t node[6])
+{
+	long hid = gethostid();
+	node[0] = 'N';
+	node[1] = 'B';
+	node[2] = (hid >> 24) & 0xff;
+	node[3] = (hid >> 16) & 0xff;
+	node[4] = (hid >>  8) & 0xff;
+	node[5] = (hid >>  0) & 0xff;
+}
+
+static void
+uuid_generate(void *u, uint64_t *timep, int count)
 {
-	struct uuid u;
+	static struct kern_uuid uuid_last;
+	uint64_t xtime, ltime;
+	uint16_t lseq;
+	struct kern_uuid *uuid = u;
+
+	uuid_node(uuid->node);
+	xtime = uuid_time();
+	*timep = xtime;
+
+	if (uuid_last.ll == 0LL || uuid_last.node[0] != uuid->node[0] ||
+	    uuid_last.node[1] != uuid->node[1] ||
+	    uuid_last.node[2] != uuid->node[2]) {
+		srandom((unsigned int) xtime);
+		uuid->seq = (uint16_t)random() & 0x3fff;
+	} else if (uuid_last.ll >= xtime)
+		uuid->seq = (uuid_last.seq + 1) & 0x3fff;
+
+	uuid_last = *uuid;
+	uuid_last.ll = (xtime + count - 1) & ((1LL << 60) - 1LL);
+}
 
-	uuidgen(&u, 1);
-	gpt_dce_to_uuid((struct dce_uuid *)&u, t);
+static void
+uuidgen(struct dce_uuid *store, int count)
+{
+	uint64_t xtime;
+	struct kern_uuid uuid;
+	int i;
+
+	/* Generate the base UUID. */
+	uuid_generate(&uuid, &xtime, count);
+
+	for (i = 0; i < count; xtime++, i++) {
+		/* Set time and version (=1) and deal with byte order. */
+		store[i].time_low = (uint32_t)xtime;
+		store[i].time_mid = (uint16_t)(xtime >> 32);
+		store[i].time_hi_and_version =
+		    ((uint16_t)(xtime >> 48) & 0xfff) | (1 << 12);
+		store[i].clock_seq_hi_and_reserved = (uuid.seq >> 16) | 0x80;
+		store[i].clock_seq_low = uuid.seq & 0xff;
+		memcpy(store[i].node, uuid.node, sizeof(uuid.node));
+	}
 }
 #endif
+
+void
+gpt_uuid_generate(gpt_uuid_t t)
+{
+	struct dce_uuid u;
+
+	uuidgen((void *)&u, 1);
+	gpt_dce_to_uuid(&u, t);
+}

Index: src/sbin/gpt/gpt_uuid.h
diff -u src/sbin/gpt/gpt_uuid.h:1.2 src/sbin/gpt/gpt_uuid.h:1.3
--- src/sbin/gpt/gpt_uuid.h:1.2	Thu Oct  2 20:51:31 2014
+++ src/sbin/gpt/gpt_uuid.h	Fri Oct  3 16:30:06 2014
@@ -91,7 +91,7 @@ void gpt_uuid_create(gpt_type_t, gpt_uui
 
 int gpt_uuid_parse(const char *, gpt_uuid_t);
 
-void gpt_uuid_create_new(gpt_uuid_t);
+void gpt_uuid_generate(gpt_uuid_t);
 
 __END_DECLS
 

Index: src/sbin/gpt/migrate.c
diff -u src/sbin/gpt/migrate.c:1.20 src/sbin/gpt/migrate.c:1.21
--- src/sbin/gpt/migrate.c:1.20	Thu Oct  2 20:51:31 2014
+++ src/sbin/gpt/migrate.c	Fri Oct  3 16:30:06 2014
@@ -33,7 +33,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/migrate.c,v 1.16 2005/09/01 02:42:52 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: migrate.c,v 1.20 2014/10/03 00:51:31 jnemeth Exp $");
+__RCSID("$NetBSD: migrate.c,v 1.21 2014/10/03 20:30:06 christos Exp $");
 #endif
 
 #include <sys/types.h>
@@ -335,7 +335,7 @@ migrate(int fd)
 	hdr->hdr_lba_alt = htole64(tpg->map_start);
 	hdr->hdr_lba_start = htole64(tbl->map_start + blocks);
 	hdr->hdr_lba_end = htole64(lbt->map_start - 1LL);
-	gpt_uuid_create_new(hdr->hdr_guid);
+	gpt_uuid_generate(hdr->hdr_guid);
 	hdr->hdr_lba_table = htole64(tbl->map_start);
 	hdr->hdr_entries = htole32((blocks * secsz) / sizeof(struct gpt_ent));
 	if (le32toh(hdr->hdr_entries) > parts)
@@ -344,7 +344,7 @@ migrate(int fd)
 
 	ent = tbl->map_data;
 	for (i = 0; i < le32toh(hdr->hdr_entries); i++) {
-		gpt_uuid_create_new(ent[i].ent_guid);
+		gpt_uuid_generate(ent[i].ent_guid);
 	}
 
 	/* Mirror partitions. */

Reply via email to