Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sbin/gpt Add two new options:



details:   https://anonhg.NetBSD.org/src/rev/a9ff61bed1a8
branches:  trunk
changeset: 325016:a9ff61bed1a8
user:      jnemeth <jnemeth%NetBSD.org@localhost>
date:      Sat Nov 30 19:43:53 2013 +0000

description:
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

diffstat:

 sbin/gpt/gpt.8  |  25 ++++++++++-----
 sbin/gpt/show.c |  88 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 99 insertions(+), 14 deletions(-)

diffs (205 lines):

diff -r c9359a5b0d30 -r a9ff61bed1a8 sbin/gpt/gpt.8
--- a/sbin/gpt/gpt.8    Sat Nov 30 19:05:25 2013 +0000
+++ b/sbin/gpt/gpt.8    Sat Nov 30 19:43:53 2013 +0000
@@ -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 @@
 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
diff -r c9359a5b0d30 -r a9ff61bed1a8 sbin/gpt/show.c
--- a/sbin/gpt/show.c   Sat Nov 30 19:05:25 2013 +0000
+++ b/sbin/gpt/show.c   Sat Nov 30 19:43:53 2013 +0000
@@ -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 @@
 
 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 @@
 }
 
 static void
-show(int fd __unused)
+show(void)
 {
        uuid_t type;
        off_t start;
@@ -138,6 +140,7 @@
        struct mbr *mbr;
        struct gpt_ent *ent;
        unsigned int i;
+       char *s;
 
        printf("  %*s", lbawidth, "start");
        printf("  %*s", lbawidth, "size");
@@ -194,6 +197,11 @@
                        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 @@
        }
 }
 
+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 @@
                        continue;
                }
 
-               show(fd);
+               if (entry > 1)
+                       show_one();
+               else
+                       show();
 
                gpt_close(fd);
        }



Home | Main Index | Thread Index | Old Index