Module Name:    src
Committed By:   jnemeth
Date:           Sat Nov 30 19:43:53 UTC 2013

Modified Files:
        src/sbin/gpt: gpt.8 show.c

Log Message:
Add two new options:

-g which shows the GUID for a partition
-i which shows all the gory details for a particular option

XXX the output format of -i is subject to change


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sbin/gpt/gpt.8
cvs rdiff -u -r1.11 -r1.12 src/sbin/gpt/show.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/gpt.8
diff -u src/sbin/gpt/gpt.8:1.20 src/sbin/gpt/gpt.8:1.21
--- src/sbin/gpt/gpt.8:1.20	Fri Nov 22 03:51:06 2013
+++ src/sbin/gpt/gpt.8	Sat Nov 30 19:43:53 2013
@@ -1,4 +1,4 @@
-.\" $NetBSD: gpt.8,v 1.20 2013/11/22 03:51:06 jnemeth Exp $
+.\" $NetBSD: gpt.8,v 1.21 2013/11/30 19:43:53 jnemeth Exp $
 .\"
 .\" Copyright (c) 2002 Marcel Moolenaar
 .\" All rights reserved.
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD: src/sbin/gpt/gpt.8,v 1.17 2006/06/22 22:22:32 marcel Exp $
 .\"
-.Dd November 21, 2013
+.Dd November 30, 2013
 .Dt GPT 8
 .Os
 .Sh NAME
@@ -333,25 +333,32 @@ If the
 option is specified then the size will be adjusted to be a multiple of
 alignment if possible.
 .\" ==== show ====
-.It Nm Ic show Oo Fl lu Oc Ar device ...
+.It Nm Ic show Oo Fl glu Oc Oo Fl i Ar index Oc Ar device ...
 The
 .Ic show
 command displays the current partitioning on the listed devices and gives
 an overall view of the disk contents.
 With the
+.Fl g
+option the GPT partition GUID will be displayed instead of the GPT partition
+type.
+With the
 .Fl l
 option the GPT partition label will be displayed instead of the GPT partition
 type.
-The option has no effect on non-GPT partitions.
 With the
 .Fl u
 option the GPT partition type is displayed as an UUID instead of in a
 user friendly form.
-The
-.Fl l
-option takes precedence over the
-.Fl u
-option.
+With the
+.Fl i
+option, all the details of a particular GPT partition will be displayed.
+None of the options have any effect on non-GPT partitions.
+The order of precedence for the options are:
+.Fl i ,
+.Fl l ,
+.Fl g ,
+.Fl u .
 .El
 .Sh EXAMPLES
 .Bd -literal

Index: src/sbin/gpt/show.c
diff -u src/sbin/gpt/show.c:1.11 src/sbin/gpt/show.c:1.12
--- src/sbin/gpt/show.c:1.11	Sat Oct 19 02:07:08 2013
+++ src/sbin/gpt/show.c	Sat Nov 30 19:43:53 2013
@@ -29,7 +29,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.11 2013/10/19 02:07:08 jnemeth Exp $");
+__RCSID("$NetBSD: show.c,v 1.12 2013/11/30 19:43:53 jnemeth Exp $");
 #endif
 
 #include <sys/types.h>
@@ -46,8 +46,10 @@ __RCSID("$NetBSD: show.c,v 1.11 2013/10/
 
 static int show_label = 0;
 static int show_uuid = 0;
+static int show_guid = 0;
+static unsigned int entry = 0;
 
-const char showmsg[] = "show [-lu] device ...";
+const char showmsg[] = "show [-glu] [-i index] device ...";
 
 __dead static void
 usage_show(void)
@@ -130,7 +132,7 @@ unfriendly:
 }
 
 static void
-show(int fd __unused)
+show(void)
 {
 	uuid_t type;
 	off_t start;
@@ -138,6 +140,7 @@ show(int fd __unused)
 	struct mbr *mbr;
 	struct gpt_ent *ent;
 	unsigned int i;
+	char *s;
 
 	printf("  %*s", lbawidth, "start");
 	printf("  %*s", lbawidth, "size");
@@ -194,6 +197,11 @@ show(int fd __unused)
 			if (show_label) {
 				printf("- \"%s\"",
 				    utf16_to_utf8(ent->ent_name));
+			} else if (show_guid) {
+				uuid_to_string((uuid_t *)ent->ent_guid,
+				    &s, NULL);
+				printf("- %s", s);
+				free(s);
 			} else {
 				le_uuid_dec(ent->ent_type, &type);
 				printf("- %s", friendly(&type));
@@ -208,13 +216,80 @@ show(int fd __unused)
 	}
 }
 
+static void
+show_one(void)
+{
+	uuid_t type;
+	map_t *m;
+	struct gpt_ent *ent;
+	const char *s1;
+	char *s2;
+
+	for (m = map_first(); m != NULL; m = m->map_next)
+		if (entry == m->map_index)
+			break;
+	if (m == NULL) {
+		warnx("%s: error: could not find index %d",
+		    device_name, entry);
+		return;
+	}
+	ent = m->map_data;
+
+	printf("Details for index %d:\n", entry);
+	printf("Start: %llu\n", (long long)m->map_start);
+	printf("Size: %llu\n", (long long)m->map_size);
+
+	le_uuid_dec(ent->ent_type, &type);
+	s1 = friendly(&type);
+	uuid_to_string(&type, &s2, NULL);
+	if (strcmp(s1, s2) == 0)
+		s1 = "unknown";
+	printf("Type: %s (%s)\n", s1, s2);
+	free(s2);
+
+	uuid_to_string((uuid_t *)ent->ent_guid, &s2, NULL);
+	printf("GUID: %s\n", s2);
+	free(s2);
+
+	printf("Label: %s\n", utf16_to_utf8(ent->ent_name));
+
+	printf("Attributes:\n");
+	if (ent->ent_attr == 0)
+		printf("  None\n");
+	else {
+		if (ent->ent_attr & GPT_ENT_ATTR_REQUIRED_PARTITION)
+			printf("  required for platform to function\n");
+		if (ent->ent_attr & GPT_ENT_ATTR_NO_BLOCK_IO_PROTOCOL)
+			printf("  UEFI won't recognize file system\n");
+		if (ent->ent_attr & GPT_ENT_ATTR_LEGACY_BIOS_BOOTABLE)
+			printf("  legacy BIOS boot partition\n");
+		if (ent->ent_attr & GPT_ENT_ATTR_BOOTME)
+			printf("  indicates a bootable partition\n");
+		if (ent->ent_attr & GPT_ENT_ATTR_BOOTONCE)
+			printf("  attempt to boot this partition only once\n");
+		if (ent->ent_attr & GPT_ENT_ATTR_BOOTFAILED)
+			printf("  partition that was marked bootonce but failed to boot\n");
+	}
+}
+
 int
 cmd_show(int argc, char *argv[])
 {
+	char *p;
 	int ch, fd;
 
-	while ((ch = getopt(argc, argv, "lu")) != -1) {
+	while ((ch = getopt(argc, argv, "gi:lu")) != -1) {
 		switch(ch) {
+		case 'g':
+			show_guid = 1;
+			break;
+		case 'i':
+			if (entry > 0)
+				usage_show();
+			entry = strtoul(optarg, &p, 10);
+			if (*p != 0 || entry < 1)
+				usage_show();
+			break;
 		case 'l':
 			show_label = 1;
 			break;
@@ -236,7 +311,10 @@ cmd_show(int argc, char *argv[])
 			continue;
 		}
 
-		show(fd);
+		if (entry > 1)
+			show_one();
+		else
+			show();
 
 		gpt_close(fd);
 	}

Reply via email to