Module Name: src
Committed By: christos
Date: Sun Dec 6 00:39:26 UTC 2015
Modified Files:
src/sbin/gpt: gpt.8 gpt.c gpt.h gpt_uuid.c gpt_uuid.h set.c show.c
type.c unset.c
Log Message:
Add listing commands for type, set and unset.
Add help and formatting for set and unset.
Change show to print all the attribute info in one line.
To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sbin/gpt/gpt.8
cvs rdiff -u -r1.63 -r1.64 src/sbin/gpt/gpt.c
cvs rdiff -u -r1.30 -r1.31 src/sbin/gpt/gpt.h src/sbin/gpt/show.c
cvs rdiff -u -r1.12 -r1.13 src/sbin/gpt/gpt_uuid.c src/sbin/gpt/type.c
cvs rdiff -u -r1.5 -r1.6 src/sbin/gpt/gpt_uuid.h
cvs rdiff -u -r1.11 -r1.12 src/sbin/gpt/set.c src/sbin/gpt/unset.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.41 src/sbin/gpt/gpt.8:1.42
--- src/sbin/gpt/gpt.8:1.41 Wed Dec 2 07:36:53 2015
+++ src/sbin/gpt/gpt.8 Sat Dec 5 19:39:26 2015
@@ -1,4 +1,4 @@
-.\" $NetBSD: gpt.8,v 1.41 2015/12/02 12:36:53 christos Exp $
+.\" $NetBSD: gpt.8,v 1.42 2015/12/06 00:39:26 christos Exp $
.\"
.\" Copyright (c) 2002 Marcel Moolenaar
.\" All rights reserved.
@@ -488,26 +488,33 @@ will automatically adjust.
However, the new disk must use the same sector size as the old disk.
.\" ==== set ====
.It Nm Ic set Fl a Ar attribute Fl i Ar index
+.It Nm Ic set Fl l
The
.Ic set
command sets various partition attributes.
The
+.Fl l
+flag lists all available attributes.
+The
.Fl a
-option specifies which attributes to set and may be specified more than once.
+option specifies which attributes to set and may be specified more than once,
+or the attributes can be comma-separated.
The
.Fl i
option specifies which entry to update.
The possible attributes are
.Do biosboot Dc ,
.Do bootme Dc ,
-.Do bootonce Dc , and
-.Do bootfailed Dc .
+.Do bootonce Dc ,
+.Do bootfailed Dc ,
+.Do noblockio Dc , and
+.Do required Dc .
The biosboot flag is used to indicate which partition should be booted
by legacy BIOS boot code.
See the
.Ic biosboot
command for more information.
-The other three attributes are for compatibility with
+The other attributes are for compatibility with
.Fx
and are not currently used by any
.Nx
@@ -546,8 +553,10 @@ The order of precedence for the options
.\" ==== 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 \
+.It Nm Ic type Oo Fl b Ar blocknr Oc Oo Fl i Ar index Oc \
Oo Fl L Ar label Oc Oo Fl s Ar sectors Oc Oo Fl t Ar type Oc \
Fl T Ar newtype
+.It Nm Ic type Fl l
The
.Ic type
command allows the user to change the type of any and all partitions
@@ -556,12 +565,19 @@ It uses the same selection options as th
.Ic label
command.
See above for a description of these options.
+The
+.Fl l
+flag lists available types.
.\" ==== unset ====
.It Nm Ic unset Fl a Ar attribute Fl i Ar index
+.It Nm Ic unset Fl l
The
.Ic unset
command unsets various partition attributes.
The
+.Fl l
+flag lists all available attributes.
+The
.Fl a
option specifies which attributes to unset and may be specified more than once.
The
@@ -570,14 +586,16 @@ option specifies which entry to update.
The possible attributes are
.Do biosboot Dc ,
.Do bootme Dc ,
-.Do bootonce Dc , and
-.Do bootfailed Dc .
+.Do bootonce Dc ,
+.Do bootfailed Dc ,
+.Do noblockio Dc , and
+.Do required Dc .
The biosboot flag is used to indicate which partition should be booted
by legacy BIOS boot code.
See the
.Ic biosboot
command for more information.
-The other three attributes are for compatibility with
+The other attributes are for compatibility with
.Fx
and are not currently used by any
.Nx
Index: src/sbin/gpt/gpt.c
diff -u src/sbin/gpt/gpt.c:1.63 src/sbin/gpt/gpt.c:1.64
--- src/sbin/gpt/gpt.c:1.63 Fri Dec 4 11:46:24 2015
+++ src/sbin/gpt/gpt.c Sat Dec 5 19:39:26 2015
@@ -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.63 2015/12/04 16:46:24 christos Exp $");
+__RCSID("$NetBSD: gpt.c,v 1.64 2015/12/06 00:39:26 christos Exp $");
#endif
#include <sys/param.h>
@@ -1076,21 +1076,90 @@ gpt_check_ais(gpt_t gpt, off_t alignment
return size / gpt->secsz;
return 0;
}
+
+static const struct nvd {
+ const char *name;
+ uint64_t mask;
+ const char *description;
+} gpt_attr[] = {
+ {
+ "biosboot",
+ GPT_ENT_ATTR_LEGACY_BIOS_BOOTABLE,
+ "Legacy BIOS boot partition",
+ },
+ {
+ "bootme",
+ GPT_ENT_ATTR_BOOTME,
+ "Bootable partition",
+ },
+ {
+ "bootfailed",
+ GPT_ENT_ATTR_BOOTFAILED,
+ "Partition that marked bootonce failed to boot",
+ },
+ {
+ "bootonce",
+ GPT_ENT_ATTR_BOOTONCE,
+ "Attempt to boot this partition only once",
+ },
+ {
+ "noblockio",
+ GPT_ENT_ATTR_NO_BLOCK_IO_PROTOCOL,
+ "UEFI won't recognize file system for block I/O",
+ },
+ {
+ "required",
+ GPT_ENT_ATTR_REQUIRED_PARTITION,
+ "Partition required for platform to function",
+ },
+};
+
int
-gpt_attr_get(uint64_t *attributes)
+gpt_attr_get(gpt_t gpt, uint64_t *attributes)
{
- if (strcmp(optarg, "biosboot") == 0)
- *attributes |= GPT_ENT_ATTR_LEGACY_BIOS_BOOTABLE;
- else if (strcmp(optarg, "bootme") == 0)
- *attributes |= GPT_ENT_ATTR_BOOTME;
- else if (strcmp(optarg, "bootonce") == 0)
- *attributes |= GPT_ENT_ATTR_BOOTONCE;
- else if (strcmp(optarg, "bootfailed") == 0)
- *attributes |= GPT_ENT_ATTR_BOOTFAILED;
- else
- return -1;
- return 0;
+ size_t i;
+ int rv = 0;
+ char *ptr;
+
+ *attributes = 0;
+
+ for (ptr = strtok(optarg, ","); ptr; ptr = strtok(NULL, ",")) {
+ for (i = 0; i < __arraycount(gpt_attr); i++)
+ if (strcmp(gpt_attr[i].name, ptr) == 0)
+ break;
+ if (i == __arraycount(gpt_attr)) {
+ gpt_warnx(gpt, "Unregognized attribute `%s'", ptr);
+ rv = -1;
+ } else
+ *attributes |= gpt_attr[i].mask;
+ }
+ return rv;
}
+
+void
+gpt_attr_help(const char *prefix)
+{
+ size_t i;
+
+ for (i = 0; i < __arraycount(gpt_attr); i++)
+ printf("%s%10.10s\t%s\n", prefix, gpt_attr[i].name,
+ gpt_attr[i].description);
+}
+
+const char *
+gpt_attr_list(char *buf, size_t len, uint64_t attributes)
+{
+ size_t i;
+ strlcpy(buf, "", len);
+
+ for (i = 0; i < __arraycount(gpt_attr); i++)
+ if (attributes & gpt_attr[i].mask) {
+ strlcat(buf, buf[0] ? "," : "", len);
+ strlcat(buf, gpt_attr[i].name, len);
+ }
+ return buf;
+}
+
int
gpt_attr_update(gpt_t gpt, u_int entry, uint64_t set, uint64_t clr)
{
Index: src/sbin/gpt/gpt.h
diff -u src/sbin/gpt/gpt.h:1.30 src/sbin/gpt/gpt.h:1.31
--- src/sbin/gpt/gpt.h:1.30 Fri Dec 4 11:46:24 2015
+++ src/sbin/gpt/gpt.h Sat Dec 5 19:39:26 2015
@@ -119,7 +119,9 @@ int gpt_add_find(gpt_t, struct gpt_find
int gpt_add_ais(gpt_t, off_t *, u_int *, off_t *, int);
off_t gpt_check_ais(gpt_t, off_t, u_int, off_t);
-int gpt_attr_get(uint64_t *);
+int gpt_attr_get(gpt_t, uint64_t *);
+const char *gpt_attr_list(char *, size_t, uint64_t);
+void gpt_attr_help(const char *);
int gpt_attr_update(gpt_t, u_int, uint64_t, uint64_t);
int gpt_uint_get(u_int *);
int gpt_human_get(off_t *);
Index: src/sbin/gpt/show.c
diff -u src/sbin/gpt/show.c:1.30 src/sbin/gpt/show.c:1.31
--- src/sbin/gpt/show.c:1.30 Thu Dec 3 20:46:12 2015
+++ src/sbin/gpt/show.c Sat Dec 5 19:39:26 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.30 2015/12/04 01:46:12 christos Exp $");
+__RCSID("$NetBSD: show.c,v 1.31 2015/12/06 00:39:26 christos Exp $");
#endif
#include <sys/types.h>
@@ -196,23 +196,14 @@ show_one(gpt_t gpt, unsigned int entry)
utf16_to_utf8(ent->ent_name, utfbuf, sizeof(utfbuf));
printf("Label: %s\n", (char *)utfbuf);
- printf("Attributes:\n");
+ printf("Attributes: ");
if (ent->ent_attr == 0) {
- printf(" None\n");
- return 0;
+ printf("None\n");
+ } else {
+ char buf[1024];
+ printf("%s\n", gpt_attr_list(buf, sizeof(buf), ent->ent_attr));
}
- 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 was marked bootonce but failed to boot\n");
+
return 0;
}
Index: src/sbin/gpt/gpt_uuid.c
diff -u src/sbin/gpt/gpt_uuid.c:1.12 src/sbin/gpt/gpt_uuid.c:1.13
--- src/sbin/gpt/gpt_uuid.c:1.12 Wed Dec 2 21:02:43 2015
+++ src/sbin/gpt/gpt_uuid.c Sat Dec 5 19:39:26 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: gpt_uuid.c,v 1.12 2015/12/03 02:02:43 christos Exp $ */
+/* $NetBSD: gpt_uuid.c,v 1.13 2015/12/06 00:39:26 christos Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#ifdef __RCSID
-__RCSID("$NetBSD: gpt_uuid.c,v 1.12 2015/12/03 02:02:43 christos Exp $");
+__RCSID("$NetBSD: gpt_uuid.c,v 1.13 2015/12/06 00:39:26 christos Exp $");
#endif
#include <err.h>
@@ -231,6 +231,15 @@ gpt_uuid_parse(const char *s, gpt_uuid_t
}
void
+gpt_uuid_help(const char *prefix)
+{
+ size_t i;
+
+ for (i = 0; i < __arraycount(gpt_nv); i++)
+ printf("%s%18.18s\t%s\n", prefix, gpt_nv[i].n, gpt_nv[i].d);
+}
+
+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);
Index: src/sbin/gpt/type.c
diff -u src/sbin/gpt/type.c:1.12 src/sbin/gpt/type.c:1.13
--- src/sbin/gpt/type.c:1.12 Wed Dec 2 20:07:28 2015
+++ src/sbin/gpt/type.c Sat Dec 5 19:39:26 2015
@@ -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.12 2015/12/03 01:07:28 christos Exp $");
+__RCSID("$NetBSD: type.c,v 1.13 2015/12/06 00:39:26 christos Exp $");
#endif
#include <sys/types.h>
@@ -54,6 +54,7 @@ static int cmd_type(gpt_t, int, char *[]
static const char *typehelp[] = {
"-a -T newtype",
"[-b blocknr] [-i index] [-L label] [-s sectors] [-t type] -T newtype",
+ "-l",
};
struct gpt_cmd c_type = {
@@ -84,8 +85,11 @@ cmd_type(gpt_t gpt, int argc, char *argv
find.msg = "type changed";
/* Get the type options */
- while ((ch = getopt(argc, argv, GPT_FIND "T:")) != -1) {
+ while ((ch = getopt(argc, argv, GPT_FIND "T:l")) != -1) {
switch(ch) {
+ case 'l':
+ gpt_uuid_help("\t");
+ return 0;
case 'T':
if (gpt_uuid_get(gpt, &newtype) == -1)
return -1;
Index: src/sbin/gpt/gpt_uuid.h
diff -u src/sbin/gpt/gpt_uuid.h:1.5 src/sbin/gpt/gpt_uuid.h:1.6
--- src/sbin/gpt/gpt_uuid.h:1.5 Tue Dec 1 18:29:07 2015
+++ src/sbin/gpt/gpt_uuid.h Sat Dec 5 19:39:26 2015
@@ -97,6 +97,8 @@ int gpt_uuid_parse(const char *, gpt_uui
struct gpt;
int gpt_uuid_generate(struct gpt *, gpt_uuid_t);
+void gpt_uuid_help(const char *);
+
__END_DECLS
#endif /* _GPT_UUID_T */
Index: src/sbin/gpt/set.c
diff -u src/sbin/gpt/set.c:1.11 src/sbin/gpt/set.c:1.12
--- src/sbin/gpt/set.c:1.11 Wed Dec 2 21:02:43 2015
+++ src/sbin/gpt/set.c Sat Dec 5 19:39:26 2015
@@ -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.11 2015/12/03 02:02:43 christos Exp $");
+__RCSID("$NetBSD: set.c,v 1.12 2015/12/06 00:39:26 christos Exp $");
#endif
#include <sys/types.h>
@@ -53,6 +53,7 @@ static int cmd_set(gpt_t, int, char *[])
static const char *sethelp[] = {
"-a attribute -i index",
+ "-l",
};
struct gpt_cmd c_set = {
@@ -71,16 +72,19 @@ cmd_set(gpt_t gpt, int argc, char *argv[
unsigned int entry = 0;
uint64_t attributes = 0;
- while ((ch = getopt(argc, argv, "a:i:")) != -1) {
+ while ((ch = getopt(argc, argv, "a:i:l")) != -1) {
switch(ch) {
case 'a':
- if (gpt_attr_get(&attributes) == -1)
+ if (gpt_attr_get(gpt, &attributes) == -1)
return usage();
break;
case 'i':
if (gpt_uint_get(&entry) == -1)
return usage();
break;
+ case 'l':
+ gpt_attr_help("\t");
+ return 0;
default:
return usage();
}
Index: src/sbin/gpt/unset.c
diff -u src/sbin/gpt/unset.c:1.11 src/sbin/gpt/unset.c:1.12
--- src/sbin/gpt/unset.c:1.11 Wed Dec 2 21:02:43 2015
+++ src/sbin/gpt/unset.c Sat Dec 5 19:39:26 2015
@@ -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.11 2015/12/03 02:02:43 christos Exp $");
+__RCSID("$NetBSD: unset.c,v 1.12 2015/12/06 00:39:26 christos Exp $");
#endif
#include <sys/types.h>
@@ -71,16 +71,19 @@ cmd_unset(gpt_t gpt, int argc, char *arg
unsigned int entry = 0;
uint64_t attributes = 0;
- while ((ch = getopt(argc, argv, "a:i:")) != -1) {
+ while ((ch = getopt(argc, argv, "a:i:l")) != -1) {
switch(ch) {
case 'a':
- if (gpt_attr_get(&attributes) == -1)
+ if (gpt_attr_get(gpt, &attributes) == -1)
return usage();
break;
case 'i':
if (gpt_uint_get(&entry) == -1)
return usage();
break;
+ case 'l':
+ gpt_attr_help("\t");
+ return 0;
default:
return usage();
}