Module Name: src Committed By: martin Date: Fri Dec 25 10:59:56 UTC 2015
Modified Files: src/sbin/gpt: gpt.8 show.c Log Message: Add a -a flag to the show command, so we can display the full GPT with all information in one go. To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/sbin/gpt/gpt.8 cvs rdiff -u -r1.31 -r1.32 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.43 src/sbin/gpt/gpt.8:1.44 --- src/sbin/gpt/gpt.8:1.43 Sun Dec 6 09:36:57 2015 +++ src/sbin/gpt/gpt.8 Fri Dec 25 10:59:56 2015 @@ -1,4 +1,4 @@ -.\" $NetBSD: gpt.8,v 1.43 2015/12/06 09:36:57 wiz Exp $ +.\" $NetBSD: gpt.8,v 1.44 2015/12/25 10:59:56 martin 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 December 6, 2015 +.Dd December 25, 2015 .Dt GPT 8 .Os .Sh NAME @@ -523,7 +523,7 @@ They may be used by .Nx code in the future. .\" ==== show ==== -.It Nm Ic show Oo Fl glu Oc Oo Fl i Ar index Oc +.It Nm Ic show Oo Fl glu Oc Oo Fl i Ar index Oc Oo Fl a Oc The .Ic show command displays the current partitioning on the listed devices and gives @@ -544,8 +544,14 @@ With the .Fl i option, all the details of a particular GPT partition will be displayed. The format of this display is subject to change. +With the +.Fl a +option, all information for all GPT partitions (just like with +.Fl i Ar index ) +will be printed. None of the options have any effect on non-GPT partitions. The order of precedence for the options are: +.Fl a , .Fl i , .Fl l , .Fl g , Index: src/sbin/gpt/show.c diff -u src/sbin/gpt/show.c:1.31 src/sbin/gpt/show.c:1.32 --- src/sbin/gpt/show.c:1.31 Sun Dec 6 00:39:26 2015 +++ src/sbin/gpt/show.c Fri Dec 25 10:59:56 2015 @@ -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.31 2015/12/06 00:39:26 christos Exp $"); +__RCSID("$NetBSD: show.c,v 1.32 2015/12/25 10:59:56 martin Exp $"); #endif #include <sys/types.h> @@ -52,12 +52,13 @@ __RCSID("$NetBSD: show.c,v 1.31 2015/12/ static int cmd_show(gpt_t, int, char *[]); static const char *showhelp[] = { - "[-glu] [-i index]", + "[-glu] [-i index] [-a]", }; #define SHOW_UUID 1 #define SHOW_GUID 2 #define SHOW_LABEL 4 +#define SHOW_ALL 8 struct gpt_cmd c_show = { "show", @@ -68,17 +69,86 @@ struct gpt_cmd c_show = { #define usage() gpt_usage(NULL, &c_show) -static int -show(gpt_t gpt, int show) +static void +print_part_type(int map_type, int flags, void *map_data, off_t map_start) { off_t start; - map_t m, p; + map_t p; struct mbr *mbr; struct gpt_ent *ent; unsigned int i; char buf[128], *b = buf; uint8_t utfbuf[__arraycount(ent->ent_name) * 3 + 1]; + switch (map_type) { + case MAP_TYPE_UNUSED: + printf("Unused"); + break; + case MAP_TYPE_MBR: + if (map_start != 0) + printf("Extended "); + printf("MBR"); + break; + case MAP_TYPE_PRI_GPT_HDR: + printf("Pri GPT header"); + break; + case MAP_TYPE_SEC_GPT_HDR: + printf("Sec GPT header"); + break; + case MAP_TYPE_PRI_GPT_TBL: + printf("Pri GPT table"); + break; + case MAP_TYPE_SEC_GPT_TBL: + printf("Sec GPT table"); + break; + case MAP_TYPE_MBR_PART: + p = map_data; + if (p->map_start != 0) + printf("Extended "); + printf("MBR part "); + mbr = p->map_data; + for (i = 0; i < 4; i++) { + start = le16toh(mbr->mbr_part[i].part_start_hi); + start = (start << 16) + + le16toh(mbr->mbr_part[i].part_start_lo); + if (map_start == p->map_start + start) + break; + } + printf("%d", mbr->mbr_part[i].part_typ); + break; + case MAP_TYPE_GPT_PART: + printf("GPT part "); + ent = map_data; + if (flags & SHOW_LABEL) { + utf16_to_utf8(ent->ent_name, utfbuf, + sizeof(utfbuf)); + b = (char *)utfbuf; + } else if (flags & SHOW_GUID) { + gpt_uuid_snprintf( buf, sizeof(buf), "%d", + ent->ent_guid); + } else if (flags & SHOW_UUID) { + gpt_uuid_snprintf(buf, sizeof(buf), + "%d", ent->ent_type); + } else { + gpt_uuid_snprintf(buf, sizeof(buf), "%ls", + ent->ent_type); + } + printf("- %s", b); + break; + case MAP_TYPE_PMBR: + printf("PMBR"); + break; + default: + printf("Unknown %#x", map_type); + break; + } +} + +static int +show(gpt_t gpt, int show) +{ + map_t m; + printf(" %*s", gpt->lbawidth, "start"); printf(" %*s", gpt->lbawidth, "size"); printf(" index contents\n"); @@ -95,68 +165,7 @@ show(gpt_t gpt, int show) printf(" "); putchar(' '); putchar(' '); - switch (m->map_type) { - case MAP_TYPE_UNUSED: - printf("Unused"); - break; - case MAP_TYPE_MBR: - if (m->map_start != 0) - printf("Extended "); - printf("MBR"); - break; - case MAP_TYPE_PRI_GPT_HDR: - printf("Pri GPT header"); - break; - case MAP_TYPE_SEC_GPT_HDR: - printf("Sec GPT header"); - break; - case MAP_TYPE_PRI_GPT_TBL: - printf("Pri GPT table"); - break; - case MAP_TYPE_SEC_GPT_TBL: - printf("Sec GPT table"); - break; - case MAP_TYPE_MBR_PART: - p = m->map_data; - if (p->map_start != 0) - printf("Extended "); - printf("MBR part "); - mbr = p->map_data; - for (i = 0; i < 4; i++) { - start = le16toh(mbr->mbr_part[i].part_start_hi); - start = (start << 16) + - le16toh(mbr->mbr_part[i].part_start_lo); - if (m->map_start == p->map_start + start) - break; - } - printf("%d", mbr->mbr_part[i].part_typ); - break; - case MAP_TYPE_GPT_PART: - printf("GPT part "); - ent = m->map_data; - if (show & SHOW_LABEL) { - utf16_to_utf8(ent->ent_name, utfbuf, - sizeof(utfbuf)); - b = (char *)utfbuf; - } else if (show & SHOW_GUID) { - gpt_uuid_snprintf( buf, sizeof(buf), "%d", - ent->ent_guid); - } else if (show & SHOW_UUID) { - gpt_uuid_snprintf(buf, sizeof(buf), - "%d", ent->ent_type); - } else { - gpt_uuid_snprintf(buf, sizeof(buf), "%ls", - ent->ent_type); - } - printf("- %s", b); - break; - case MAP_TYPE_PMBR: - printf("PMBR"); - break; - default: - printf("Unknown %#x", m->map_type); - break; - } + print_part_type(m->map_type, show, m->map_data, m->map_start); putchar('\n'); m = m->map_next; } @@ -208,14 +217,76 @@ show_one(gpt_t gpt, unsigned int entry) } static int +show_all(gpt_t gpt) +{ + map_t m; + struct gpt_ent *ent; + char s1[128], s2[128]; + uint8_t utfbuf[__arraycount(ent->ent_name) * 3 + 1]; +#define PFX " " + + printf(" %*s", gpt->lbawidth, "start"); + printf(" %*s", gpt->lbawidth, "size"); + printf(" index contents\n"); + + 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); + putchar(' '); + putchar(' '); + if (m->map_index > 0) { + printf("%5d ", m->map_index); + print_part_type(m->map_type, 0, m->map_data, + m->map_start); + putchar('\n'); + + ent = m->map_data; + + gpt_uuid_snprintf(s1, sizeof(s1), "%s", ent->ent_type); + gpt_uuid_snprintf(s2, sizeof(s2), "%d", ent->ent_type); + if (strcmp(s1, s2) == 0) + strlcpy(s1, "unknown", sizeof(s1)); + printf(PFX "Type: %s (%s)\n", s1, s2); + + gpt_uuid_snprintf(s2, sizeof(s1), "%d", ent->ent_guid); + printf(PFX "GUID: %s\n", s2); + + utf16_to_utf8(ent->ent_name, utfbuf, sizeof(utfbuf)); + printf(PFX "Label: %s\n", (char *)utfbuf); + + printf(PFX "Attributes: "); + if (ent->ent_attr == 0) { + printf("None\n"); + } else { + char buf[1024]; + + printf("%s\n", gpt_attr_list(buf, sizeof(buf), + ent->ent_attr)); + } + } else { + printf(" "); + print_part_type(m->map_type, 0, m->map_data, + m->map_start); + putchar('\n'); + } + m = m->map_next; + } + return 0; +} + +static int cmd_show(gpt_t gpt, int argc, char *argv[]) { int ch; int xshow = 0; unsigned int entry = 0; - while ((ch = getopt(argc, argv, "gi:lu")) != -1) { + while ((ch = getopt(argc, argv, "gi:lua")) != -1) { switch(ch) { + case 'a': + xshow |= SHOW_ALL; + break; case 'g': xshow |= SHOW_GUID; break; @@ -237,5 +308,8 @@ cmd_show(gpt_t gpt, int argc, char *argv if (argc != optind) return usage(); + if (xshow & SHOW_ALL) + return show_all(gpt); + return entry > 0 ? show_one(gpt, entry) : show(gpt, xshow); }