Module Name: src
Committed By: christos
Date: Tue Sep 30 18:00:00 UTC 2014
Modified Files:
src/sbin/gpt: Makefile add.c backup.c biosboot.c create.c gpt.c gpt.h
label.c migrate.c remove.c resize.c resizedisk.c restore.c set.c
show.c type.c unset.c
Added Files:
src/sbin/gpt: gpt_uuid.c gpt_uuid.h
Log Message:
Add internal uuid support, since the linux+macos versions of the library
are different than than *bsd ones, and others might not have it at all.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sbin/gpt/Makefile src/sbin/gpt/biosboot.c
cvs rdiff -u -r1.26 -r1.27 src/sbin/gpt/add.c
cvs rdiff -u -r1.7 -r1.8 src/sbin/gpt/backup.c
cvs rdiff -u -r1.9 -r1.10 src/sbin/gpt/create.c
cvs rdiff -u -r1.33 -r1.34 src/sbin/gpt/gpt.c
cvs rdiff -u -r1.15 -r1.16 src/sbin/gpt/gpt.h src/sbin/gpt/remove.c
cvs rdiff -u -r0 -r1.1 src/sbin/gpt/gpt_uuid.c src/sbin/gpt/gpt_uuid.h
cvs rdiff -u -r1.17 -r1.18 src/sbin/gpt/label.c
cvs rdiff -u -r1.18 -r1.19 src/sbin/gpt/migrate.c src/sbin/gpt/show.c
cvs rdiff -u -r1.10 -r1.11 src/sbin/gpt/resize.c
cvs rdiff -u -r1.4 -r1.5 src/sbin/gpt/resizedisk.c src/sbin/gpt/set.c \
src/sbin/gpt/type.c src/sbin/gpt/unset.c
cvs rdiff -u -r1.5 -r1.6 src/sbin/gpt/restore.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/Makefile
diff -u src/sbin/gpt/Makefile:1.11 src/sbin/gpt/Makefile:1.12
--- src/sbin/gpt/Makefile:1.11 Mon Sep 29 17:04:34 2014
+++ src/sbin/gpt/Makefile Tue Sep 30 13:59:59 2014
@@ -1,10 +1,10 @@
-# $NetBSD: Makefile,v 1.11 2014/09/29 21:04:34 christos Exp $
+# $NetBSD: Makefile,v 1.12 2014/09/30 17:59:59 christos Exp $
# $FreeBSD: src/sbin/gpt/Makefile,v 1.7 2005/09/01 02:49:20 marcel Exp $
PROG= gpt
SRCS= add.c biosboot.c create.c destroy.c gpt.c label.c map.c \
migrate.c recover.c remove.c resize.c resizedisk.c \
- set.c show.c type.c unset.c
+ set.c show.c type.c unset.c gpt_uuid.c
MAN= gpt.8
.if (${HOSTPROG:U} == "")
Index: src/sbin/gpt/biosboot.c
diff -u src/sbin/gpt/biosboot.c:1.11 src/sbin/gpt/biosboot.c:1.12
--- src/sbin/gpt/biosboot.c:1.11 Mon Sep 29 17:04:34 2014
+++ src/sbin/gpt/biosboot.c Tue Sep 30 13:59:59 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: biosboot.c,v 1.11 2014/09/29 21:04:34 christos Exp $ */
+/* $NetBSD: biosboot.c,v 1.12 2014/09/30 17:59:59 christos Exp $ */
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#ifdef __RCSID
-__RCSID("$NetBSD: biosboot.c,v 1.11 2014/09/29 21:04:34 christos Exp $");
+__RCSID("$NetBSD: biosboot.c,v 1.12 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/stat.h>
@@ -49,18 +49,12 @@ __RCSID("$NetBSD: biosboot.c,v 1.11 2014
#include <err.h>
#include <fcntl.h>
-#include <inttypes.h>
#include <paths.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#ifndef NBTOOL_CONFIG_H
-#include <util.h>
-#else
-#include "opendisk.h"
-#endif
#include "map.h"
#include "gpt.h"
@@ -274,7 +268,9 @@ biosboot(int fd)
int
cmd_biosboot(int argc, char *argv[])
{
+#ifdef DIOCGWEDGEINFO
struct dkwedge_info dkw;
+#endif
struct stat sb;
char devpath[MAXPATHLEN];
char *dev, *p;
Index: src/sbin/gpt/add.c
diff -u src/sbin/gpt/add.c:1.26 src/sbin/gpt/add.c:1.27
--- src/sbin/gpt/add.c:1.26 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/add.c Tue Sep 30 13:59:59 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: add.c,v 1.26 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: add.c,v 1.27 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/types.h>
@@ -44,12 +44,11 @@ __RCSID("$NetBSD: add.c,v 1.26 2014/09/3
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <inttypes.h>
#include "map.h"
#include "gpt.h"
-static uuid_t type;
+static gpt_uuid_t type;
static off_t alignment, block, sectors, size;
static unsigned int entry;
static uint8_t *name;
@@ -71,7 +70,6 @@ usage_add(void)
static void
add(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
map_t *map;
@@ -114,8 +112,7 @@ add(int fd)
i = entry - 1;
ent = (void*)((char*)tbl->map_data + i *
le32toh(hdr->hdr_entsz));
- uuid_dec_le(ent->ent_type, &uuid);
- if (!uuid_is_nil(&uuid, NULL)) {
+ if (!gpt_uuid_is_nil(ent->ent_type)) {
warnx("%s: error: entry at index %u is not free",
device_name, entry);
return;
@@ -125,8 +122,7 @@ add(int fd)
for (i = 0; i < le32toh(hdr->hdr_entries); i++) {
ent = (void*)((char*)tbl->map_data + i *
le32toh(hdr->hdr_entsz));
- uuid_dec_le(ent->ent_type, &uuid);
- if (uuid_is_nil(&uuid, NULL))
+ if (gpt_uuid_is_nil(ent->ent_type))
break;
}
if (i == le32toh(hdr->hdr_entries)) {
@@ -153,7 +149,7 @@ add(int fd)
}
}
- uuid_enc_le(ent->ent_type, &type);
+ gpt_uuid_copy(ent->ent_type, type);
ent->ent_lba_start = htole64(map->map_start);
ent->ent_lba_end = htole64(map->map_start + map->map_size - 1LL);
if (name != NULL)
@@ -170,7 +166,7 @@ add(int fd)
hdr = tpg->map_data;
ent = (void*)((char*)lbt->map_data + i * le32toh(hdr->hdr_entsz));
- uuid_enc_le(ent->ent_type, &type);
+ gpt_uuid_copy(ent->ent_type, type);
ent->ent_lba_start = htole64(map->map_start);
ent->ent_lba_end = htole64(map->map_start + map->map_size - 1LL);
if (name != NULL)
@@ -257,9 +253,9 @@ cmd_add(int argc, char *argv[])
sectors = 0;
break;
case 't':
- if (!uuid_is_nil(&type, NULL))
+ if (!gpt_uuid_is_nil(type))
usage_add();
- if (parse_uuid(optarg, &type) != 0)
+ if (gpt_uuid_parse(optarg, type) != 0)
usage_add();
break;
default:
@@ -271,9 +267,8 @@ cmd_add(int argc, char *argv[])
usage_add();
/* Create NetBSD FFS partitions by default. */
- if (uuid_is_nil(&type, NULL)) {
- static const uuid_t nb_ffs = GPT_ENT_TYPE_NETBSD_FFS;
- type = nb_ffs;
+ if (gpt_uuid_is_nil(type)) {
+ gpt_uuid_create(GPT_TYPE_NETBSD_FFS, type, NULL, 0);
}
while (optind < argc) {
Index: src/sbin/gpt/backup.c
diff -u src/sbin/gpt/backup.c:1.7 src/sbin/gpt/backup.c:1.8
--- src/sbin/gpt/backup.c:1.7 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/backup.c Tue Sep 30 13:59:59 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/show.c,v 1.14 2006/06/22 22:22:32 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: backup.c,v 1.7 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: backup.c,v 1.8 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/bootblock.h>
@@ -70,7 +70,6 @@ usage_backup(void)
static void
backup(void)
{
- uuid_t u;
map_t *m;
struct mbr *mbr;
struct gpt_ent *ent;
@@ -81,7 +80,7 @@ backup(void)
prop_data_t propdata;
prop_number_t propnum;
prop_string_t propstr;
- char *propext, *s;
+ char *propext, *s, buf[128];
bool rc;
props = prop_dictionary_create();
@@ -201,10 +200,9 @@ backup(void)
rc = prop_dictionary_set(type_dict, "revision",
propnum);
PROP_ERR(rc);
- uuid_dec_le(hdr->hdr_guid, &u);
- uuid_to_string(&u, &s, NULL);
- propstr = prop_string_create_cstring(s);
- free(s);
+ gpt_uuid_snprintf(buf, sizeof(buf), "%d",
+ hdr->hdr_guid);
+ propstr = prop_string_create_cstring(buf);
PROP_ERR(propstr);
rc = prop_dictionary_set(type_dict, "guid", propstr);
PROP_ERR(rc);
@@ -232,17 +230,15 @@ backup(void)
rc = prop_dictionary_set(gpt_dict, "index",
propnum);
PROP_ERR(propnum);
- uuid_dec_le(ent->ent_type, &u);
- uuid_to_string(&u, &s, NULL);
- propstr = prop_string_create_cstring(s);
- free(s);
+ gpt_uuid_snprintf(buf, sizeof(buf), "%d",
+ ent->ent_type);
+ propstr = prop_string_create_cstring(buf);
PROP_ERR(propstr);
rc = prop_dictionary_set(gpt_dict, "type",
propstr);
- uuid_dec_le(ent->ent_guid, &u);
- uuid_to_string(&u, &s, NULL);
- propstr = prop_string_create_cstring(s);
- free(s);
+ gpt_uuid_snprintf(buf, sizeof(buf), "%d",
+ ent->ent_guid);
+ propstr = prop_string_create_cstring(buf);
PROP_ERR(propstr);
rc = prop_dictionary_set(gpt_dict, "guid",
propstr);
Index: src/sbin/gpt/create.c
diff -u src/sbin/gpt/create.c:1.9 src/sbin/gpt/create.c:1.10
--- src/sbin/gpt/create.c:1.9 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/create.c Tue Sep 30 13:59:59 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.9 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: create.c,v 1.10 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/types.h>
@@ -66,7 +66,6 @@ usage_create(void)
static void
create(int fd)
{
- uuid_t uuid;
off_t blocks, last;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
@@ -175,8 +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);
- uuid_create(&uuid, NULL);
- uuid_enc_le(hdr->hdr_guid, &uuid);
+ gpt_uuid_copy(hdr->hdr_guid, gpt_uuid_nil);
hdr->hdr_lba_table = htole64(tbl->map_start);
hdr->hdr_entries = htole32((blocks * secsz) / sizeof(struct gpt_ent));
if (le32toh(hdr->hdr_entries) > parts)
@@ -185,8 +183,7 @@ create(int fd)
ent = tbl->map_data;
for (i = 0; i < le32toh(hdr->hdr_entries); i++) {
- uuid_create(&uuid, NULL);
- uuid_enc_le(ent[i].ent_guid, &uuid);
+ gpt_uuid_copy(ent[i].ent_guid, gpt_uuid_nil);
}
hdr->hdr_crc_table = htole32(crc32(ent, le32toh(hdr->hdr_entries) *
Index: src/sbin/gpt/gpt.c
diff -u src/sbin/gpt/gpt.c:1.33 src/sbin/gpt/gpt.c:1.34
--- src/sbin/gpt/gpt.c:1.33 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/gpt.c Tue Sep 30 13:59:59 2014
@@ -35,7 +35,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/gpt.c,v 1.16 2006/07/07 02:44:23 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: gpt.c,v 1.33 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: gpt.c,v 1.34 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/param.h>
@@ -56,11 +56,8 @@ __RCSID("$NetBSD: gpt.c,v 1.33 2014/09/3
#include <unistd.h>
#include <ctype.h>
#ifndef HAVE_NBTOOL_CONFIG_H
-#include <util.h>
#include <prop/proplib.h>
#include <sys/drvctlio.h>
-#else
-#include "opendisk.h"
#endif
#include "map.h"
@@ -248,98 +245,6 @@ utf8_to_utf16(const uint8_t *s8, uint16_
} while (c != 0);
}
-int
-parse_uuid(const char *s, uuid_t *uuid)
-{
- uint32_t status;
-
- uuid_from_string(s, uuid, &status);
- if (status == uuid_s_ok)
- return (0);
-
- switch (*s) {
- case 'b':
- if (strcmp(s, "bios") == 0) {
- static const uuid_t bios = GPT_ENT_TYPE_BIOS;
- *uuid = bios;
- return (0);
- }
- break;
- case 'c':
- if (strcmp(s, "ccd") == 0) {
- static const uuid_t ccd = GPT_ENT_TYPE_NETBSD_CCD;
- *uuid = ccd;
- return (0);
- } else if (strcmp(s, "cgd") == 0) {
- static const uuid_t cgd = GPT_ENT_TYPE_NETBSD_CGD;
- *uuid = cgd;
- return (0);
- }
- break;
- case 'e':
- if (strcmp(s, "efi") == 0) {
- static const uuid_t efi = GPT_ENT_TYPE_EFI;
- *uuid = efi;
- return (0);
- }
- break;
- case 'f':
- if (strcmp(s, "ffs") == 0) {
- static const uuid_t nb_ffs = GPT_ENT_TYPE_NETBSD_FFS;
- *uuid = nb_ffs;
- return (0);
- }
- break;
- case 'h':
- if (strcmp(s, "hfs") == 0) {
- static const uuid_t hfs = GPT_ENT_TYPE_APPLE_HFS;
- *uuid = hfs;
- return (0);
- }
- break;
- case 'l':
- if (strcmp(s, "lfs") == 0) {
- static const uuid_t lfs = GPT_ENT_TYPE_NETBSD_LFS;
- *uuid = lfs;
- return (0);
- } else if (strcmp(s, "linux") == 0) {
- static const uuid_t lnx = GPT_ENT_TYPE_LINUX_DATA;
- *uuid = lnx;
- return (0);
- }
- break;
- case 'r':
- if (strcmp(s, "raid") == 0) {
- static const uuid_t raid = GPT_ENT_TYPE_NETBSD_RAIDFRAME;
- *uuid = raid;
- return (0);
- }
- break;
- case 's':
- if (strcmp(s, "swap") == 0) {
- static const uuid_t sw = GPT_ENT_TYPE_NETBSD_SWAP;
- *uuid = sw;
- return (0);
- }
- break;
- case 'u':
- if (strcmp(s, "ufs") == 0) {
- static const uuid_t ufs = GPT_ENT_TYPE_NETBSD_FFS;
- *uuid = ufs;
- return (0);
- }
- break;
- case 'w':
- if (strcmp(s, "windows") == 0) {
- static const uuid_t win = GPT_ENT_TYPE_MS_BASIC_DATA;
- *uuid = win;
- return (0);
- }
- break;
- }
- return (EINVAL);
-}
-
void*
gpt_read(int fd, off_t lba, size_t count)
{
@@ -547,11 +452,10 @@ out:
int
gpt_gpt(int fd, off_t lba, int found)
{
- uuid_t type;
off_t size;
struct gpt_ent *ent;
struct gpt_hdr *hdr;
- char *p, *s;
+ char *p;
map_t *m;
size_t blocks, tblsz;
unsigned int i;
@@ -616,19 +520,19 @@ gpt_gpt(int fd, off_t lba, int found)
for (i = 0; i < le32toh(hdr->hdr_entries); i++) {
ent = (void*)(p + i * le32toh(hdr->hdr_entsz));
- if (uuid_is_nil((uuid_t *)&ent->ent_type, NULL))
+ if (gpt_uuid_is_nil(ent->ent_type))
continue;
size = le64toh(ent->ent_lba_end) - le64toh(ent->ent_lba_start) +
1LL;
if (verbose > 2) {
- uuid_dec_le(&ent->ent_type, &type);
- uuid_to_string(&type, &s, NULL);
- warnx(
- "%s: GPT partition: type=%s, start=%llu, size=%llu", device_name, s,
+ char buf[128];
+ gpt_uuid_snprintf(buf, sizeof(buf), "%s",
+ ent->ent_type);
+ warnx("%s: GPT partition: type=%s, start=%llu, "
+ "size=%llu", device_name, buf,
(long long)le64toh(ent->ent_lba_start),
(long long)size);
- free(s);
}
m = map_add(le64toh(ent->ent_lba_start), size,
MAP_TYPE_GPT_PART, ent);
Index: src/sbin/gpt/gpt.h
diff -u src/sbin/gpt/gpt.h:1.15 src/sbin/gpt/gpt.h:1.16
--- src/sbin/gpt/gpt.h:1.15 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/gpt.h Tue Sep 30 13:59:59 2014
@@ -29,16 +29,14 @@
#ifndef _GPT_H_
#define _GPT_H_
-#include <sys/endian.h>
#ifndef HAVE_NBTOOL_CONFIG_H
-#include <sys/disklabel_gpt.h>
+#include <util.h>
#else
-#include <nbinclude/sys/disklabel_gpt.h>
+#include "opendisk.h"
+#include "namespace.h"
#endif
-#include <uuid.h>
-
-int parse_uuid(const char *, uuid_t *);
+#include "gpt_uuid.h"
struct mbr_part {
uint8_t part_flag; /* bootstrap flags */
Index: src/sbin/gpt/remove.c
diff -u src/sbin/gpt/remove.c:1.15 src/sbin/gpt/remove.c:1.16
--- src/sbin/gpt/remove.c:1.15 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/remove.c Tue Sep 30 13:59:59 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/remove.c,v 1.10 2006/10/04 18:20:25 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: remove.c,v 1.15 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: remove.c,v 1.16 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/types.h>
@@ -49,7 +49,7 @@ __RCSID("$NetBSD: remove.c,v 1.15 2014/0
#include "gpt.h"
static int all;
-static uuid_t type;
+static gpt_uuid_t type;
static off_t block, size;
static unsigned int entry;
static uint8_t *label;
@@ -72,7 +72,6 @@ usage_remove(void)
static void
rem(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
map_t *m;
@@ -123,14 +122,12 @@ rem(int fd)
(char *)utf16_to_utf8(ent->ent_name)) != 0)
continue;
- uuid_dec_le(ent->ent_type, &uuid);
- if (!uuid_is_nil(&type, NULL) &&
- !uuid_equal(&type, &uuid, NULL))
+ if (!gpt_uuid_is_nil(type) &&
+ !gpt_uuid_equal(type, ent->ent_type))
continue;
/* Remove the primary entry by clearing the partition type. */
- uuid_create_nil(&uuid, NULL);
- uuid_enc_le(ent->ent_type, &uuid);
+ gpt_uuid_copy(ent->ent_type, gpt_uuid_nil);
hdr->hdr_crc_table = htole32(crc32(tbl->map_data,
le32toh(hdr->hdr_entries) * le32toh(hdr->hdr_entsz)));
@@ -145,7 +142,7 @@ rem(int fd)
le32toh(hdr->hdr_entsz));
/* Remove the secondary entry. */
- uuid_enc_le(ent->ent_type, &uuid);
+ gpt_uuid_copy(ent->ent_type, gpt_uuid_nil);
hdr->hdr_crc_table = htole32(crc32(lbt->map_data,
le32toh(hdr->hdr_entries) * le32toh(hdr->hdr_entsz)));
@@ -203,9 +200,9 @@ cmd_remove(int argc, char *argv[])
usage_remove();
break;
case 't':
- if (!uuid_is_nil(&type, NULL))
+ if (!gpt_uuid_is_nil(type))
usage_remove();
- if (parse_uuid(optarg, &type) != 0)
+ if (gpt_uuid_parse(optarg, type) != 0)
usage_remove();
break;
default:
@@ -215,7 +212,7 @@ cmd_remove(int argc, char *argv[])
if (!all ^
(block > 0 || entry > 0 || label != NULL || size > 0 ||
- !uuid_is_nil(&type, NULL)))
+ !gpt_uuid_is_nil(type)))
usage_remove();
if (argc == optind)
Index: src/sbin/gpt/label.c
diff -u src/sbin/gpt/label.c:1.17 src/sbin/gpt/label.c:1.18
--- src/sbin/gpt/label.c:1.17 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/label.c Tue Sep 30 13:59:59 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/label.c,v 1.3 2006/10/04 18:20:25 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: label.c,v 1.17 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: label.c,v 1.18 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/types.h>
@@ -47,9 +47,10 @@ __RCSID("$NetBSD: label.c,v 1.17 2014/09
#include "map.h"
#include "gpt.h"
+#include "gpt_uuid.h"
static int all;
-static uuid_t type;
+static gpt_uuid_t type;
static off_t block, size;
static unsigned int entry;
static uint8_t *name, *xlabel;
@@ -73,7 +74,6 @@ usage_label(void)
static void
label(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
map_t *m;
@@ -124,9 +124,8 @@ label(int fd)
(char *)utf16_to_utf8(ent->ent_name)) != 0)
continue;
- uuid_dec_le(ent->ent_type, &uuid);
- if (!uuid_is_nil(&type, NULL) &&
- !uuid_equal(&type, &uuid, NULL))
+ if (!gpt_uuid_is_nil(type) &&
+ !gpt_uuid_equal(type, ent->ent_type))
continue;
/* Label the primary entry. */
@@ -241,9 +240,9 @@ cmd_label(int argc, char *argv[])
usage_label();
break;
case 't':
- if (!uuid_is_nil(&type, NULL))
+ if (!gpt_uuid_is_nil(type))
usage_label();
- if (parse_uuid(optarg, &type) != 0)
+ if (gpt_uuid_parse(optarg, type) != 0)
usage_label();
break;
default:
@@ -253,7 +252,7 @@ cmd_label(int argc, char *argv[])
if (!all ^
(block > 0 || entry > 0 || xlabel != NULL || size > 0 ||
- !uuid_is_nil(&type, NULL)))
+ !gpt_uuid_is_nil(type)))
usage_label();
if (name == NULL || argc == optind)
Index: src/sbin/gpt/migrate.c
diff -u src/sbin/gpt/migrate.c:1.18 src/sbin/gpt/migrate.c:1.19
--- src/sbin/gpt/migrate.c:1.18 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/migrate.c Tue Sep 30 13:59:59 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.18 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: migrate.c,v 1.19 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/types.h>
@@ -125,31 +125,23 @@ migrate_disklabel(int fd, off_t start, s
case FS_UNUSED:
continue;
case FS_SWAP: {
- static const uuid_t swap = GPT_ENT_TYPE_FREEBSD_SWAP;
- uuid_enc_le(ent->ent_type, &swap);
- utf8_to_utf16((const uint8_t *)"FreeBSD swap partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_FREEBSD_SWAP, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FS_BSDFFS: {
- static const uuid_t ufs = GPT_ENT_TYPE_FREEBSD_UFS;
- uuid_enc_le(ent->ent_type, &ufs);
- utf8_to_utf16((const uint8_t *)"FreeBSD UFS partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_FREEBSD_UFS, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FREEBSD_FS_VINUM: {
- static const uuid_t vinum = GPT_ENT_TYPE_FREEBSD_VINUM;
- uuid_enc_le(ent->ent_type, &vinum);
- utf8_to_utf16((const uint8_t *)"FreeBSD vinum partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_FREEBSD_VINUM, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FREEBSD_FS_ZFS: {
- static const uuid_t zfs = GPT_ENT_TYPE_FREEBSD_ZFS;
- uuid_enc_le(ent->ent_type, &zfs);
- utf8_to_utf16((const uint8_t *)"FreeBSD ZFS partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_FREEBSD_ZFS, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
default:
@@ -207,45 +199,33 @@ migrate_netbsd_disklabel(int fd, off_t s
case FS_UNUSED:
continue;
case FS_SWAP: {
- static const uuid_t swap = GPT_ENT_TYPE_NETBSD_SWAP;
- uuid_enc_le(ent->ent_type, &swap);
- utf8_to_utf16((const uint8_t *)"NetBSD swap partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_NETBSD_SWAP, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FS_BSDFFS: {
- static const uuid_t ufs = GPT_ENT_TYPE_NETBSD_FFS;
- uuid_enc_le(ent->ent_type, &ufs);
- utf8_to_utf16((const uint8_t *)"NetBSD FFS partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_NETBSD_FFS, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FS_BSDLFS: {
- static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_LFS;
- uuid_enc_le(ent->ent_type, &zfs);
- utf8_to_utf16((const uint8_t *)"NetBSD LFS partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_NETBSD_LFS, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FS_RAID: {
- static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_RAIDFRAME;
- uuid_enc_le(ent->ent_type, &zfs);
- utf8_to_utf16((const uint8_t *)"NetBSD RAIDframe partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_NETBSD_RAIDFRAME, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FS_CCD: {
- static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_CCD;
- uuid_enc_le(ent->ent_type, &zfs);
- utf8_to_utf16((const uint8_t *)"NetBSD CCD partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_NETBSD_CCD, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
case FS_CGD: {
- static const uuid_t zfs = GPT_ENT_TYPE_NETBSD_CGD;
- uuid_enc_le(ent->ent_type, &zfs);
- utf8_to_utf16((const uint8_t *)"NetBSD CGD partition",
- ent->ent_name, 36);
+ gpt_uuid_create(GPT_TYPE_NETBSD_CGD, ent->ent_type,
+ ent->ent_name, sizeof(ent->ent_name));
break;
}
default:
@@ -270,7 +250,6 @@ migrate_netbsd_disklabel(int fd, off_t s
static void
migrate(int fd)
{
- uuid_t uuid;
off_t blocks, last;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
@@ -356,8 +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);
- uuid_create(&uuid, NULL);
- uuid_enc_le(hdr->hdr_guid, &uuid);
+ gpt_uuid_copy(hdr->hdr_guid, gpt_uuid_nil);
hdr->hdr_lba_table = htole64(tbl->map_start);
hdr->hdr_entries = htole32((blocks * secsz) / sizeof(struct gpt_ent));
if (le32toh(hdr->hdr_entries) > parts)
@@ -366,8 +344,7 @@ migrate(int fd)
ent = tbl->map_data;
for (i = 0; i < le32toh(hdr->hdr_entries); i++) {
- uuid_create(&uuid, NULL);
- uuid_enc_le(ent[i].ent_guid, &uuid);
+ gpt_uuid_copy(ent[i].ent_guid, gpt_uuid_nil);
}
/* Mirror partitions. */
@@ -382,12 +359,11 @@ migrate(int fd)
continue;
case MBR_PTYPE_386BSD: { /* FreeBSD */
if (slice) {
- static const uuid_t freebsd = GPT_ENT_TYPE_FREEBSD;
- uuid_enc_le(ent->ent_type, &freebsd);
+ gpt_uuid_create(GPT_TYPE_FREEBSD,
+ ent->ent_type, ent->ent_name,
+ sizeof(ent->ent_name));
ent->ent_lba_start = htole64((uint64_t)start);
ent->ent_lba_end = htole64(start + size - 1LL);
- utf8_to_utf16((const uint8_t *)"FreeBSD disklabel partition",
- ent->ent_name, 36);
ent++;
} else
ent = migrate_disklabel(fd, start, ent);
@@ -397,12 +373,11 @@ migrate(int fd)
ent = migrate_netbsd_disklabel(fd, start, ent);
break;
case MBR_PTYPE_EFI: {
- static const uuid_t efi_slice = GPT_ENT_TYPE_EFI;
- uuid_enc_le(ent->ent_type, &efi_slice);
+ gpt_uuid_create(GPT_TYPE_EFI,
+ ent->ent_type, ent->ent_name,
+ sizeof(ent->ent_name));
ent->ent_lba_start = htole64((uint64_t)start);
ent->ent_lba_end = htole64(start + size - 1LL);
- utf8_to_utf16((const uint8_t *)"EFI system partition",
- ent->ent_name, 36);
ent++;
break;
}
Index: src/sbin/gpt/show.c
diff -u src/sbin/gpt/show.c:1.18 src/sbin/gpt/show.c:1.19
--- src/sbin/gpt/show.c:1.18 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/show.c Tue Sep 30 14:00:00 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/show.c,v 1.14 2006/06/22 22:22:32 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: show.c,v 1.18 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: show.c,v 1.19 2014/09/30 18:00:00 christos Exp $");
#endif
#include <sys/types.h>
@@ -64,87 +64,14 @@ usage_show(void)
exit(1);
}
-static const char *
-friendly(uuid_t *t)
-{
- static const uuid_t efi_slice = GPT_ENT_TYPE_EFI;
- static const uuid_t bios_boot = GPT_ENT_TYPE_BIOS;
- static const uuid_t msdata = GPT_ENT_TYPE_MS_BASIC_DATA;
- static const uuid_t freebsd = GPT_ENT_TYPE_FREEBSD;
- static const uuid_t hfs = GPT_ENT_TYPE_APPLE_HFS;
- static const uuid_t linuxdata = GPT_ENT_TYPE_LINUX_DATA;
- static const uuid_t linuxswap = GPT_ENT_TYPE_LINUX_SWAP;
- static const uuid_t msr = GPT_ENT_TYPE_MS_RESERVED;
- static const uuid_t swap = GPT_ENT_TYPE_FREEBSD_SWAP;
- static const uuid_t ufs = GPT_ENT_TYPE_FREEBSD_UFS;
- static const uuid_t vinum = GPT_ENT_TYPE_FREEBSD_VINUM;
- static const uuid_t zfs = GPT_ENT_TYPE_FREEBSD_ZFS;
- static const uuid_t nb_swap = GPT_ENT_TYPE_NETBSD_SWAP;
- static const uuid_t nb_ffs = GPT_ENT_TYPE_NETBSD_FFS;
- static const uuid_t nb_lfs = GPT_ENT_TYPE_NETBSD_LFS;
- static const uuid_t nb_raid = GPT_ENT_TYPE_NETBSD_RAIDFRAME;
- static const uuid_t nb_ccd = GPT_ENT_TYPE_NETBSD_CCD;
- static const uuid_t nb_cgd = GPT_ENT_TYPE_NETBSD_CGD;
- static char buf[80];
- char *s;
-
- if (show_uuid)
- goto unfriendly;
-
- if (uuid_equal(t, &efi_slice, NULL))
- return ("EFI System");
- if (uuid_equal(t, &bios_boot, NULL))
- return ("BIOS Boot");
- if (uuid_equal(t, &nb_swap, NULL))
- return ("NetBSD swap");
- if (uuid_equal(t, &nb_ffs, NULL))
- return ("NetBSD FFSv1/FFSv2");
- if (uuid_equal(t, &nb_lfs, NULL))
- return ("NetBSD LFS");
- if (uuid_equal(t, &nb_raid, NULL))
- return ("NetBSD RAIDFrame component");
- if (uuid_equal(t, &nb_ccd, NULL))
- return ("NetBSD ccd component");
- if (uuid_equal(t, &nb_cgd, NULL))
- return ("NetBSD Cryptographic Disk");
- if (uuid_equal(t, &swap, NULL))
- return ("FreeBSD swap");
- if (uuid_equal(t, &ufs, NULL))
- return ("FreeBSD UFS/UFS2");
- if (uuid_equal(t, &vinum, NULL))
- return ("FreeBSD vinum");
- if (uuid_equal(t, &zfs, NULL))
- return ("FreeBSD ZFS");
- if (uuid_equal(t, &freebsd, NULL))
- return ("FreeBSD legacy");
- if (uuid_equal(t, &msdata, NULL))
- return ("Windows basic data");
- if (uuid_equal(t, &msr, NULL))
- return ("Windows reserved");
- if (uuid_equal(t, &linuxdata, NULL))
- return ("Linux data");
- if (uuid_equal(t, &linuxswap, NULL))
- return ("Linux swap");
- if (uuid_equal(t, &hfs, NULL))
- return ("Apple HFS");
-
-unfriendly:
- uuid_to_string(t, &s, NULL);
- strlcpy(buf, s, sizeof buf);
- free(s);
- return (buf);
-}
-
static void
show(void)
{
- uuid_t guid, type;
off_t start;
map_t *m, *p;
struct mbr *mbr;
struct gpt_ent *ent;
unsigned int i;
- char *s;
printf(" %*s", lbawidth, "start");
printf(" %*s", lbawidth, "size");
@@ -202,13 +129,15 @@ show(void)
printf("- \"%s\"",
utf16_to_utf8(ent->ent_name));
} else if (show_guid) {
- uuid_dec_le(ent->ent_guid, &guid);
- uuid_to_string(&guid, &s, NULL);
- printf("- %s", s);
- free(s);
+ char buf[128];
+ gpt_uuid_snprintf(
+ buf, sizeof(buf), "%d", ent->ent_guid);
+ printf("- %s", buf);
} else {
- uuid_dec_le(ent->ent_type, &type);
- printf("- %s", friendly(&type));
+ char buf[128];
+ gpt_uuid_snprintf(
+ buf, sizeof(buf), "%s", ent->ent_type);
+ printf("- %s", buf);
}
break;
case MAP_TYPE_PMBR:
@@ -223,11 +152,9 @@ show(void)
static void
show_one(void)
{
- uuid_t guid, type;
map_t *m;
struct gpt_ent *ent;
- const char *s1;
- char *s2;
+ char s1[128], s2[128];
#ifdef HN_AUTOSCALE
char human_num[5];
#endif
@@ -263,18 +190,14 @@ show_one(void)
#endif
printf("Size: %llu\n", (long long)m->map_size);
- uuid_dec_le(ent->ent_type, &type);
- s1 = friendly(&type);
- uuid_to_string(&type, &s2, NULL);
+ gpt_uuid_snprintf(s1, sizeof(s1), "%s", ent->ent_type);
+ gpt_uuid_snprintf(s2, sizeof(s1), "%d", ent->ent_type);
if (strcmp(s1, s2) == 0)
- s1 = "unknown";
+ strlcpy(s1, "unknown", sizeof(s1));
printf("Type: %s (%s)\n", s1, s2);
- free(s2);
- uuid_dec_le(ent->ent_guid, &guid);
- uuid_to_string(&guid, &s2, NULL);
+ gpt_uuid_snprintf(s2, sizeof(s1), "%d", ent->ent_guid);
printf("GUID: %s\n", s2);
- free(s2);
printf("Label: %s\n", utf16_to_utf8(ent->ent_name));
Index: src/sbin/gpt/resize.c
diff -u src/sbin/gpt/resize.c:1.10 src/sbin/gpt/resize.c:1.11
--- src/sbin/gpt/resize.c:1.10 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/resize.c Tue Sep 30 13:59:59 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: resize.c,v 1.10 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: resize.c,v 1.11 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/types.h>
@@ -44,7 +44,6 @@ __RCSID("$NetBSD: resize.c,v 1.10 2014/0
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <inttypes.h>
#include "map.h"
#include "gpt.h"
@@ -66,7 +65,6 @@ usage_resize(void)
static void
resize(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
map_t *map;
@@ -108,8 +106,7 @@ resize(int fd)
i = entry - 1;
ent = (void*)((char*)tbl->map_data + i *
le32toh(hdr->hdr_entsz));
- uuid_dec_le(ent->ent_type, &uuid);
- if (uuid_is_nil(&uuid, NULL)) {
+ if (gpt_uuid_is_nil(ent->ent_type)) {
warnx("%s: error: entry at index %u is unused",
device_name, entry);
return;
Index: src/sbin/gpt/resizedisk.c
diff -u src/sbin/gpt/resizedisk.c:1.4 src/sbin/gpt/resizedisk.c:1.5
--- src/sbin/gpt/resizedisk.c:1.4 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/resizedisk.c Tue Sep 30 13:59:59 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: resizedisk.c,v 1.4 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: resizedisk.c,v 1.5 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/bootblock.h>
@@ -45,7 +45,6 @@ __RCSID("$NetBSD: resizedisk.c,v 1.4 201
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <inttypes.h>
#include "map.h"
#include "gpt.h"
@@ -77,7 +76,6 @@ usage_resizedisk(void)
static void
resizedisk(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
map_t *mbrmap;
@@ -139,8 +137,7 @@ resizedisk(int fd)
for (ent = tbl->map_data; ent <
(struct gpt_ent *)((char *)tbl->map_data +
le32toh(hdr->hdr_entries) * le32toh(hdr->hdr_entsz)); ent++) {
- uuid_dec_le(ent->ent_type, &uuid);
- if (!uuid_is_nil(&uuid, NULL) &&
+ if (!gpt_uuid_is_nil(ent->ent_type) &&
(le64toh(ent->ent_lba_end) > lastdata)) {
lastdata = le64toh(ent->ent_lba_end);
}
Index: src/sbin/gpt/set.c
diff -u src/sbin/gpt/set.c:1.4 src/sbin/gpt/set.c:1.5
--- src/sbin/gpt/set.c:1.4 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/set.c Tue Sep 30 14:00:00 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: set.c,v 1.4 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: set.c,v 1.5 2014/09/30 18:00:00 christos Exp $");
#endif
#include <sys/types.h>
@@ -44,7 +44,6 @@ __RCSID("$NetBSD: set.c,v 1.4 2014/09/30
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <inttypes.h>
#include "map.h"
#include "gpt.h"
@@ -66,7 +65,6 @@ usage_set(void)
static void
set(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
struct gpt_hdr *hdr;
@@ -106,8 +104,7 @@ set(int fd)
i = entry - 1;
ent = (void*)((char*)tbl->map_data + i *
le32toh(hdr->hdr_entsz));
- uuid_dec_le(ent->ent_type, &uuid);
- if (uuid_is_nil(&uuid, NULL)) {
+ if (gpt_uuid_is_nil(ent->ent_type)) {
warnx("%s: error: entry at index %u is unused",
device_name, entry);
return;
Index: src/sbin/gpt/type.c
diff -u src/sbin/gpt/type.c:1.4 src/sbin/gpt/type.c:1.5
--- src/sbin/gpt/type.c:1.4 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/type.c Tue Sep 30 14:00:00 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/remove.c,v 1.10 2006/10/04 18:20:25 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: type.c,v 1.4 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: type.c,v 1.5 2014/09/30 18:00:00 christos Exp $");
#endif
#include <sys/types.h>
@@ -49,7 +49,7 @@ __RCSID("$NetBSD: type.c,v 1.4 2014/09/3
#include "gpt.h"
static int all;
-static uuid_t type, newtype;
+static gpt_uuid_t type, newtype;
static off_t block, size;
static unsigned int entry;
static uint8_t *label;
@@ -74,7 +74,6 @@ usage_type(void)
static void
chtype(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
map_t *m;
@@ -125,13 +124,12 @@ chtype(int fd)
(char *)utf16_to_utf8(ent->ent_name)) != 0)
continue;
- uuid_dec_le(ent->ent_type, &uuid);
- if (!uuid_is_nil(&type, NULL) &&
- !uuid_equal(&type, &uuid, NULL))
+ if (!gpt_uuid_is_nil(ent->ent_type) &&
+ !gpt_uuid_equal(type, ent->ent_type))
continue;
/* Change the primary entry. */
- uuid_enc_le(ent->ent_type, &newtype);
+ gpt_uuid_copy(ent->ent_type, newtype);
hdr->hdr_crc_table = htole32(crc32(tbl->map_data,
le32toh(hdr->hdr_entries) * le32toh(hdr->hdr_entsz)));
@@ -146,7 +144,7 @@ chtype(int fd)
le32toh(hdr->hdr_entsz));
/* Change the secondary entry. */
- uuid_enc_le(ent->ent_type, &newtype);
+ gpt_uuid_copy(ent->ent_type, newtype);
hdr->hdr_crc_table = htole32(crc32(lbt->map_data,
le32toh(hdr->hdr_entries) * le32toh(hdr->hdr_entsz)));
@@ -203,15 +201,15 @@ cmd_type(int argc, char *argv[])
usage_type();
break;
case 't':
- if (!uuid_is_nil(&type, NULL))
+ if (!gpt_uuid_is_nil(type))
usage_type();
- if (parse_uuid(optarg, &type) != 0)
+ if (gpt_uuid_parse(optarg, type) != 0)
usage_type();
break;
case 'T':
- if (!uuid_is_nil(&newtype, NULL))
+ if (!gpt_uuid_is_nil(newtype))
usage_type();
- if (parse_uuid(optarg, &newtype) != 0)
+ if (gpt_uuid_parse(optarg, newtype) != 0)
usage_type();
break;
default:
@@ -221,9 +219,9 @@ cmd_type(int argc, char *argv[])
if (!all ^
(block > 0 || entry > 0 || label != NULL || size > 0 ||
- !uuid_is_nil(&type, NULL)))
+ !gpt_uuid_is_nil(type)))
usage_type();
- if (uuid_is_nil(&newtype, NULL))
+ if (gpt_uuid_is_nil(newtype))
usage_type();
if (argc == optind)
Index: src/sbin/gpt/unset.c
diff -u src/sbin/gpt/unset.c:1.4 src/sbin/gpt/unset.c:1.5
--- src/sbin/gpt/unset.c:1.4 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/unset.c Tue Sep 30 14:00:00 2014
@@ -33,7 +33,7 @@
__FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
#endif
#ifdef __RCSID
-__RCSID("$NetBSD: unset.c,v 1.4 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: unset.c,v 1.5 2014/09/30 18:00:00 christos Exp $");
#endif
#include <sys/types.h>
@@ -44,7 +44,6 @@ __RCSID("$NetBSD: unset.c,v 1.4 2014/09/
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <inttypes.h>
#include "map.h"
#include "gpt.h"
@@ -66,7 +65,6 @@ usage_unset(void)
static void
unset(int fd)
{
- uuid_t uuid;
map_t *gpt, *tpg;
map_t *tbl, *lbt;
struct gpt_hdr *hdr;
@@ -106,8 +104,7 @@ unset(int fd)
i = entry - 1;
ent = (void*)((char*)tbl->map_data + i *
le32toh(hdr->hdr_entsz));
- uuid_dec_le(ent->ent_type, &uuid);
- if (uuid_is_nil(&uuid, NULL)) {
+ if (gpt_uuid_is_nil(ent->ent_type)) {
warnx("%s: error: entry at index %u is unused",
device_name, entry);
return;
Index: src/sbin/gpt/restore.c
diff -u src/sbin/gpt/restore.c:1.5 src/sbin/gpt/restore.c:1.6
--- src/sbin/gpt/restore.c:1.5 Mon Sep 29 22:12:55 2014
+++ src/sbin/gpt/restore.c Tue Sep 30 13:59:59 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: restore.c,v 1.5 2014/09/30 02:12:55 christos Exp $");
+__RCSID("$NetBSD: restore.c,v 1.6 2014/09/30 17:59:59 christos Exp $");
#endif
#include <sys/types.h>
@@ -72,7 +72,7 @@ usage_restore(void)
static void
restore(int fd)
{
- uuid_t gpt_guid, uuid;
+ gpt_uuid_t uuid;
off_t firstdata, last, lastdata, gpe_start, gpe_end;
map_t *map;
struct mbr *mbr;
@@ -85,10 +85,9 @@ restore(int fd)
prop_array_t mbr_array, gpt_array;
prop_number_t propnum;
prop_string_t propstr;
- int entries, gpt_size, rc;
+ int entries, gpt_size;
const char *s;
void *secbuf;
- uint32_t status;
last = mediasz / secsz - 1LL;
@@ -146,13 +145,10 @@ restore(int fd)
propstr = prop_dictionary_get(gpt_dict, "guid");
PROP_ERR(propstr);
s = prop_string_cstring_nocopy(propstr);
- uuid_from_string(s, &uuid, &status);
- if (status != uuid_s_ok) {
+ if (gpt_uuid_parse(s, uuid) != 0) {
warnx("%s: not able to convert to an UUID\n", s);
return;
}
- uuid_enc_le(&gpt_guid, &uuid);
-
firstdata = gpt_size + 2; /* PMBR and GPT header */
lastdata = last - gpt_size - 1; /* alt. GPT table and header */
@@ -166,17 +162,11 @@ restore(int fd)
propstr = prop_dictionary_get(gpt_dict, "type");
PROP_ERR(propstr);
s = prop_string_cstring_nocopy(propstr);
- uuid_from_string(s, &uuid, &status);
- if (status != uuid_s_ok) {
- warnx("%s: not able to convert to an UUID\n", s);
- return;
- }
- rc = uuid_is_nil(&uuid, &status);
- if (status != uuid_s_ok) {
+ if (gpt_uuid_parse(s, uuid) != 0) {
warnx("%s: not able to convert to an UUID\n", s);
return;
}
- if (rc == 1)
+ if (gpt_uuid_is_nil(uuid))
continue;
propnum = prop_dictionary_get(gpt_dict, "start");
PROP_ERR(propnum);
@@ -310,21 +300,17 @@ restore(int fd)
propstr = prop_dictionary_get(gpt_dict, "type");
PROP_ERR(propstr);
s = prop_string_cstring_nocopy(propstr);
- uuid_from_string(s, &uuid, &status);
- if (status != uuid_s_ok) {
+ if (gpt_uuid_parse(s, ent.ent_type) != 0) {
warnx("%s: not able to convert to an UUID\n", s);
return;
}
- uuid_enc_le(&ent.ent_type, &uuid);
propstr = prop_dictionary_get(gpt_dict, "guid");
PROP_ERR(propstr);
s = prop_string_cstring_nocopy(propstr);
- uuid_from_string(s, &uuid, &status);
- if (status != uuid_s_ok) {
+ if (gpt_uuid_parse(s, ent.ent_guid) != 0) {
warnx("%s: not able to convert to an UUID\n", s);
return;
}
- uuid_enc_le(&ent.ent_guid, &uuid);
propnum = prop_dictionary_get(gpt_dict, "start");
PROP_ERR(propnum);
ent.ent_lba_start =
@@ -369,7 +355,7 @@ restore(int fd)
hdr->hdr_lba_alt = htole64(last);
hdr->hdr_lba_start = htole64(firstdata);
hdr->hdr_lba_end = htole64(lastdata);
- memcpy(hdr->hdr_guid, &gpt_guid, sizeof(hdr->hdr_guid));
+ gpt_uuid_copy(hdr->hdr_guid, uuid);
hdr->hdr_lba_table = htole64(2);
hdr->hdr_entries = htole32(entries);
hdr->hdr_entsz = htole32(sizeof(struct gpt_ent));
Added files:
Index: src/sbin/gpt/gpt_uuid.c
diff -u /dev/null src/sbin/gpt/gpt_uuid.c:1.1
--- /dev/null Tue Sep 30 14:00:00 2014
+++ src/sbin/gpt/gpt_uuid.c Tue Sep 30 13:59:59 2014
@@ -0,0 +1,214 @@
+/* $NetBSD: gpt_uuid.c,v 1.1 2014/09/30 17:59:59 christos Exp $ */
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if HAVE_NBTOOL_CONFIG_H
+#include "nbtool_config.h"
+#endif
+
+#include <sys/cdefs.h>
+#ifdef __RCSID
+__RCSID("$NetBSD: gpt_uuid.c,v 1.1 2014/09/30 17:59:59 christos Exp $");
+#endif
+
+#include <stdio.h>
+
+#include "map.h"
+#include "gpt.h"
+
+#ifndef HAVE_NBTOOLS_CONFIG_H
+#include <sys/endian.h>
+#endif
+
+const gpt_uuid_t gpt_uuid_nil;
+
+struct dce_uuid {
+ uint32_t time_low;
+ uint16_t time_mid;
+ uint16_t time_hi_and_version;
+ uint8_t clock_seq_hi_and_reserved;
+ uint8_t clock_seq_low;
+ uint8_t node[6];
+};
+
+static const struct {
+ struct dce_uuid u;
+ const char *n;
+ const char *d;
+} gpt_nv[] = {
+ { GPT_ENT_TYPE_APPLE_HFS, "apple", "Apple HFS" },
+ { GPT_ENT_TYPE_BIOS, "bios", "BIOS Boot" },
+ { GPT_ENT_TYPE_EFI, "efi", "EFI System" },
+ { GPT_ENT_TYPE_FREEBSD, "fbsd-legacy", "FreeBSD legacy" },
+ { GPT_ENT_TYPE_FREEBSD_SWAP, "fbsd-swap", "FreeBSD swap" },
+ { GPT_ENT_TYPE_FREEBSD_UFS, "fbsd-ufs", "FreeBSD UFS/UFS2" },
+ { GPT_ENT_TYPE_FREEBSD_VINUM, "fbsd-vinum", "FreeBSD vinum" },
+ { GPT_ENT_TYPE_FREEBSD_ZFS, "fbsd-zfs", "FreeBSD ZFS" },
+ { GPT_ENT_TYPE_LINUX_DATA, "linux-data", "Linux data" },
+ { GPT_ENT_TYPE_LINUX_SWAP, "linux-swap", "Linux swap" },
+ { GPT_ENT_TYPE_MS_BASIC_DATA, "windows", "Windows basic data" },
+ { GPT_ENT_TYPE_MS_RESERVED, "windows-reserved", "Windows reserved" },
+ { GPT_ENT_TYPE_NETBSD_CCD, "ccd", "NetBSD ccd component" },
+ { GPT_ENT_TYPE_NETBSD_CGD, "cgd", "NetBSD Cryptographic Disk" },
+ { GPT_ENT_TYPE_NETBSD_FFS, "ffs", "NetBSD FFSv1/FFSv2" },
+ { GPT_ENT_TYPE_NETBSD_LFS, "lfs", "NetBSD LFS" },
+ { GPT_ENT_TYPE_NETBSD_RAIDFRAME, "raid",
+ "NetBSD RAIDFrame component" },
+ { GPT_ENT_TYPE_NETBSD_SWAP, "swap", "NetBSD swap" },
+};
+
+static void
+gpt_uuid_to_dce(const gpt_uuid_t buf, struct dce_uuid *uuid)
+{
+ const uint8_t *p = buf;
+ size_t i;
+
+ uuid->time_low = le32dec(p);
+ uuid->time_mid = le16dec(p + 4);
+ uuid->time_hi_and_version = le16dec(p + 6);
+ uuid->clock_seq_hi_and_reserved = p[8];
+ uuid->clock_seq_low = p[9];
+ for (i = 0; i < sizeof(uuid->node); i++)
+ uuid->node[i] = p[10 + i];
+}
+
+static void
+gpt_dce_to_uuid(const struct dce_uuid *uuid, uint8_t *buf)
+{
+ uint8_t *p = buf;
+ size_t i;
+
+ le32enc(p, uuid->time_low);
+ le16enc(p + 4, uuid->time_mid);
+ le16enc(p + 6, uuid->time_hi_and_version);
+ p[8] = uuid->clock_seq_hi_and_reserved;
+ p[9] = uuid->clock_seq_low;
+ for (i = 0; i < sizeof(uuid->node); i++)
+ p[10 + i] = uuid->node[i];
+}
+
+static int
+gpt_uuid_numeric(char *buf, size_t bufsiz, const struct dce_uuid *u)
+{
+ return snprintf(buf, bufsiz,
+ "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ u->time_low, u->time_mid, u->time_hi_and_version,
+ u->clock_seq_hi_and_reserved, u->clock_seq_low, u->node[0],
+ u->node[1], u->node[2], u->node[3], u->node[4], u->node[5]);
+}
+
+
+static int
+gpt_uuid_symbolic(char *buf, size_t bufsiz, const struct dce_uuid *u)
+{
+ size_t i;
+
+ for (i = 0; i < __arraycount(gpt_nv); i++)
+ if (memcmp(&gpt_nv[i].u, u, sizeof(*u)) == 0)
+ return strlcpy(buf, gpt_nv[i].n, bufsiz);
+ return -1;
+}
+
+int
+gpt_uuid_snprintf(char *buf, size_t bufsiz, const char *fmt,
+ const gpt_uuid_t uu)
+{
+ struct dce_uuid u;
+ gpt_uuid_to_dce(uu, &u);
+
+ if (fmt[1] == 's') {
+ int r;
+ if ((r = gpt_uuid_symbolic(buf, bufsiz, &u)) != -1)
+ return r;
+ }
+ return gpt_uuid_numeric(buf, bufsiz, &u);
+}
+
+static int
+gpt_uuid_parse_numeric(const char *s, struct dce_uuid *u)
+{
+ int n;
+
+ if (s == NULL || *s == '\0') {
+ memset(u, 0, sizeof(*u));
+ return 0;
+ }
+
+ n = sscanf(s,
+ "%8x-%4hx-%4hx-%2hhx%2hhx-%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx",
+ &u->time_low, &u->time_mid, &u->time_hi_and_version,
+ &u->clock_seq_hi_and_reserved, &u->clock_seq_low, &u->node[0],
+ &u->node[1], &u->node[2], &u->node[3], &u->node[4], &u->node[5]);
+
+ /* Make sure we have all conversions. */
+ if (n != 11)
+ return -1;
+
+ /* We have a successful scan. Check semantics... */
+ n = u->clock_seq_hi_and_reserved;
+ if ((n & 0x80) != 0x00 && /* variant 0? */
+ (n & 0xc0) != 0x80 && /* variant 1? */
+ (n & 0xe0) != 0xc0) /* variant 2? */
+ return -1;
+ return 0;
+}
+
+static int
+gpt_uuid_parse_symbolic(const char *s, struct dce_uuid *u)
+{
+ size_t i;
+
+ for (i = 0; i < __arraycount(gpt_nv); i++)
+ if (strcmp(gpt_nv[i].n, s) == 0) {
+ *u = gpt_nv[i].u;
+ return 0;
+ }
+ return -1;
+}
+
+int
+gpt_uuid_parse(const char *s, gpt_uuid_t uuid)
+{
+ struct dce_uuid u;
+
+ if (gpt_uuid_parse_numeric(s, &u) != -1)
+ return 0;
+
+ if (gpt_uuid_parse_symbolic(s, &u) == -1)
+ return -1;
+
+ gpt_dce_to_uuid(&u, uuid);
+ return 0;
+}
+
+void
+gpt_uuid_create(gpt_type_t t, gpt_uuid_t u, uint16_t *b, size_t s)
+{
+ gpt_dce_to_uuid(&gpt_nv[t].u, u);
+ if (b)
+ utf8_to_utf16((const uint8_t *)gpt_nv[t].d, b, s / sizeof(*b));
+}
Index: src/sbin/gpt/gpt_uuid.h
diff -u /dev/null src/sbin/gpt/gpt_uuid.h:1.1
--- /dev/null Tue Sep 30 14:00:00 2014
+++ src/sbin/gpt/gpt_uuid.h Tue Sep 30 13:59:59 2014
@@ -0,0 +1,96 @@
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef _GPT_UUID_H
+#define _GPT_UUID_H
+
+#include <string.h>
+#include <inttypes.h>
+#ifndef HAVE_NBTOOL_CONFIG_H
+#include <sys/disklabel_gpt.h>
+#else
+#include <nbinclude/sys/disklabel_gpt.h>
+#endif
+
+/*
+ * We define our own uuid type so that we don't have to mess around
+ * with different uuid implementation (linux+macosx which use an
+ * array, and {Free,Net}BSD who use a struct. We just need minimal
+ * support anyway
+ */
+
+// Must match the array in gpt_uuid.c
+typedef enum {
+ GPT_TYPE_APPLE_HFS = 0,
+ GPT_TYPE_BIOS,
+ GPT_TYPE_EFI,
+ GPT_TYPE_FREEBSD,
+ GPT_TYPE_FREEBSD_SWAP,
+ GPT_TYPE_FREEBSD_UFS,
+ GPT_TYPE_FREEBSD_VINUM,
+ GPT_TYPE_FREEBSD_ZFS,
+ GPT_TYPE_LINUX_DATA,
+ GPT_TYPE_LINUX_SWAP,
+ GPT_TYPE_MS_BASIC_DATA,
+ GPT_TYPE_MS_RESERVED,
+ GPT_TYPE_NETBSD_CCD,
+ GPT_TYPE_NETBSD_CGD,
+ GPT_TYPE_NETBSD_FFS,
+ GPT_TYPE_NETBSD_LFS,
+ GPT_TYPE_NETBSD_RAIDFRAME,
+ GPT_TYPE_NETBSD_SWAP
+} gpt_type_t;
+
+typedef uint8_t gpt_uuid_t[16];
+extern const gpt_uuid_t gpt_uuid_nil;
+
+__BEGIN_DECLS
+static inline int
+gpt_uuid_is_nil(const gpt_uuid_t u) {
+ return memcmp(u, gpt_uuid_nil, sizeof(gpt_uuid_t)) == 0;
+}
+
+static inline int
+gpt_uuid_equal(const gpt_uuid_t u1, const gpt_uuid_t u2) {
+ return memcmp(u1, u2, sizeof(gpt_uuid_t)) == 0;
+}
+
+static inline void
+gpt_uuid_copy(gpt_uuid_t u1, const gpt_uuid_t u2) {
+ memcpy(u1, u2, sizeof(gpt_uuid_t));
+}
+
+int gpt_uuid_snprintf(char *, size_t, const char *, const gpt_uuid_t);
+
+void gpt_uuid_create(gpt_type_t, gpt_uuid_t, uint16_t *, size_t);
+
+int gpt_uuid_parse(const char *, gpt_uuid_t);
+
+__END_DECLS
+
+#endif /* _GPT_UUID_T */