Module Name: src
Committed By: christos
Date: Mon Nov 4 18:36:17 UTC 2024
Modified Files:
src/sbin/gpt: gpt.8 show.c
Log Message:
Additions to guid printing and an option to print start/size in hex
(from Anon Ymous)
To generate a diff of this commit:
cvs rdiff -u -r1.83 -r1.84 src/sbin/gpt/gpt.8
cvs rdiff -u -r1.45 -r1.46 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.83 src/sbin/gpt/gpt.8:1.84
--- src/sbin/gpt/gpt.8:1.83 Mon Aug 19 13:15:38 2024
+++ src/sbin/gpt/gpt.8 Mon Nov 4 13:36:16 2024
@@ -1,4 +1,4 @@
-.\" $NetBSD: gpt.8,v 1.83 2024/08/19 17:15:38 christos Exp $
+.\" $NetBSD: gpt.8,v 1.84 2024/11/04 18:36:16 christos 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 August 19, 2024
+.Dd November 4, 2024
.Dt GPT 8
.Os
.Sh NAME
@@ -632,7 +632,7 @@ They may be used by
.Nx
in the future.
.\" ==== show ====
-.It Nm Ic show Oo Fl aglu Oc Oo Fl i Ar index Oc Oo Fl b Ar startsec Oc
+.It Nm Ic show Oo Fl aglux Oc Oo Fl i Ar index Oc Oo Fl b Ar startsec Oc
The
.Ic show
command displays the current partitioning on the listed devices and gives
@@ -660,13 +660,17 @@ With the
option, all information for all GPT partitions (just like with
.Fl i Ar index )
will be printed.
+The
+.Fl x
+option prints start/size in hex.
None of the options have any effect on non-GPT partitions.
The order of precedence for the options is:
.Fl a ,
.Fl i ,
.Fl l ,
.Fl g ,
-.Fl u .
+.Fl u ,
+.Fl x .
.\" ==== type ====
.It Nm Ic type Oo Fl a Oc Fl T Ar newtype
.It Nm Ic type Oo Fl b Ar blocknr Oc Oo Fl i Ar index Oc \
Index: src/sbin/gpt/show.c
diff -u src/sbin/gpt/show.c:1.45 src/sbin/gpt/show.c:1.46
--- src/sbin/gpt/show.c:1.45 Fri Sep 13 07:07:35 2024
+++ src/sbin/gpt/show.c Mon Nov 4 13:36:16 2024
@@ -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.45 2024/09/13 11:07:35 mlelstv Exp $");
+__RCSID("$NetBSD: show.c,v 1.46 2024/11/04 18:36:16 christos Exp $");
#endif
#include <sys/bootblock.h>
@@ -54,13 +54,14 @@ __RCSID("$NetBSD: show.c,v 1.45 2024/09/
static int cmd_show(gpt_t, int, char *[]);
static const char *showhelp[] = {
- "[-aglu] [-i index]",
+ "[-aglux] [-i index]",
};
#define SHOW_UUID 1
#define SHOW_GUID 2
#define SHOW_LABEL 4
#define SHOW_ALL 8
+#define SHOW_HEX 16
struct gpt_cmd c_show = {
"show",
@@ -71,6 +72,46 @@ struct gpt_cmd c_show = {
#define usage() gpt_usage(NULL, &c_show)
+static const char *
+get_mbr_sig(char *b, size_t blen, const uint8_t *bp)
+{
+ gpt_uuid_t uuid;
+
+ /*
+ * MBR partitions have a 4 byte signature in the MBR. Table
+ * 10.54 of UEFI Spec 2.10 Errata A states how this is to be
+ * formatted as a GUID.
+ *
+ * XXX: I thought I had seen more on this elsewhere, but I
+ * can't seem to find it now. In particular, the endianness
+ * of this quanity is not clear in the above.
+ *
+ * XXX: The location and size of the MBR signature should be
+ * in 'struct mbr,' e.g.:
+ *
+ * struct mbr {
+ * uint8_t mbr_code[440];
+ * uint32_t mbr_disc_sig;
+ * uint16_t mbr_unknown;
+ * struct mbr_part mbr_part[4];
+ * uint16_t mbr_sig;
+ * };
+ *
+ * For now, we just hardcode it. Ugh!
+ */
+ memset(uuid, 0, sizeof(uuid));
+ memcpy(uuid, bp + 440, 4);
+ gpt_uuid_snprintf(b, blen, "%d", uuid);
+ return b;
+}
+
+static const char *
+get_gpt_hdr_guid(char *b, size_t blen, struct gpt_hdr *hdr)
+{
+ gpt_uuid_snprintf(b, blen, "%d", hdr->hdr_guid);
+ return b;
+}
+
static void
print_part_type(int map_type, int flags, void *map_data, off_t map_start)
{
@@ -90,12 +131,21 @@ print_part_type(int map_type, int flags,
if (map_start != 0)
printf("Extended ");
printf("MBR");
+ if (map_start == 0 && flags & SHOW_GUID)
+ printf(" - %s",
+ get_mbr_sig(buf, sizeof(buf), map_data));
break;
case MAP_TYPE_PRI_GPT_HDR:
printf("Pri GPT header");
+ if (flags & SHOW_GUID)
+ printf(" - %s",
+ get_gpt_hdr_guid(buf, sizeof(buf), map_data));
break;
case MAP_TYPE_SEC_GPT_HDR:
printf("Sec GPT header");
+ if (flags & SHOW_GUID)
+ printf(" - %s",
+ get_gpt_hdr_guid(buf, sizeof(buf), map_data));
break;
case MAP_TYPE_PRI_GPT_TBL:
printf("Pri GPT table");
@@ -169,8 +219,9 @@ show(gpt_t gpt, int xshow)
m = map_first(gpt);
while (m != NULL) {
- printf(" %*llu", gpt->lbawidth, (long long)m->map_start);
- printf(" %*llu", gpt->lbawidth, (long long)m->map_size);
+#define FMT (xshow & SHOW_HEX) ? " %*jx" : " %*ju"
+ printf(FMT, gpt->lbawidth, (uintmax_t)m->map_start);
+ printf(FMT, gpt->lbawidth, (uintmax_t)m->map_size);
putchar(' ');
putchar(' ');
if (m->map_index > 0)
@@ -250,7 +301,7 @@ show_one(gpt_t gpt, unsigned int entry)
}
static int
-show_all(gpt_t gpt)
+show_all(gpt_t gpt, int xshow)
{
map_t m;
struct gpt_ent *ent;
@@ -267,8 +318,8 @@ show_all(gpt_t gpt)
m = map_first(gpt);
while (m != NULL) {
- printf(" %*llu", gpt->lbawidth, (long long)m->map_start);
- printf(" %*llu", gpt->lbawidth, (long long)m->map_size);
+ printf(FMT, gpt->lbawidth, (uintmax_t)m->map_start);
+ printf(FMT, gpt->lbawidth, (uintmax_t)m->map_size);
putchar(' ');
putchar(' ');
if (m->map_index > 0) {
@@ -284,10 +335,33 @@ show_all(gpt_t gpt)
if (strcmp(s1, s2) == 0)
strlcpy(s1, "unknown", sizeof(s1));
printf(PFX "Type: %s\n", s1);
- printf(PFX "TypeID: %s\n", s2);
-
- gpt_uuid_snprintf(s2, sizeof(s2), "%d", ent->ent_guid);
- printf(PFX "GUID: %s\n", s2);
+ if (m->map_type == MAP_TYPE_MBR_PART) {
+ static uint8_t unused_uuid[sizeof(gpt_uuid_t)];
+ /*
+ * MBR part partitions don't have
+ * GUIDs, so don't create a bogus one!
+ *
+ * We could get the TypeID from the
+ * partition type (the one byte OSType
+ * field in the partition structure),
+ * perhaps borrowing info from fdisk.
+ * However, some OSTypes have multiple
+ * OSes assigned to them and many may
+ * not have official UUIDs.
+ *
+ * Should we even print anything for
+ * these, in particular the GUID?
+ */
+ gpt_uuid_snprintf(s2, sizeof(s2), "%d",
+ unused_uuid);
+ printf(PFX "TypeID: %s\n", s2); /* XXX: show this? */
+ printf(PFX "GUID: %s\n", s2); /* XXX: show this? */
+ }
+ else {
+ printf(PFX "TypeID: %s\n", s2);
+ gpt_uuid_snprintf(s2, sizeof(s2), "%d", ent->ent_guid);
+ printf(PFX "GUID: %s\n", s2);
+ }
printf(PFX "Size: ");
#ifdef HN_AUTOSCALE
@@ -323,6 +397,21 @@ show_all(gpt_t gpt)
print_part_type(m->map_type, 0, m->map_data,
m->map_start);
putchar('\n');
+
+ switch (m->map_type) {
+ case MAP_TYPE_PRI_GPT_HDR:
+ case MAP_TYPE_SEC_GPT_HDR:
+ printf(PFX "GUID: %s\n",
+ get_gpt_hdr_guid(s1, sizeof(s1),
+ m->map_data));
+ break;
+ case MAP_TYPE_MBR:
+ printf(PFX "GUID: %s\n",
+ get_mbr_sig(s1, sizeof(s1), m->map_data));
+ break;
+ default:
+ break;
+ }
}
m = m->map_next;
}
@@ -338,7 +427,7 @@ cmd_show(gpt_t gpt, int argc, char *argv
off_t start = 0;
map_t m;
- while ((ch = getopt(argc, argv, "gi:b:lua")) != -1) {
+ while ((ch = getopt(argc, argv, "gi:b:luax")) != -1) {
switch(ch) {
case 'a':
xshow |= SHOW_ALL;
@@ -360,6 +449,9 @@ cmd_show(gpt_t gpt, int argc, char *argv
case 'u':
xshow |= SHOW_UUID;
break;
+ case 'x':
+ xshow |= SHOW_HEX;
+ break;
default:
return usage();
}
@@ -372,7 +464,7 @@ cmd_show(gpt_t gpt, int argc, char *argv
printf("GPT not found, displaying data from MBR.\n\n");
if (xshow & SHOW_ALL)
- return show_all(gpt);
+ return show_all(gpt, xshow);
if (start > 0) {
for (m = map_first(gpt); m != NULL; m = m->map_next) {