summaryrefslogtreecommitdiffstats
path: root/sbin/geom/class/eli/geom_eli.c
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2006-09-16 10:43:17 +0000
committerpjd <pjd@FreeBSD.org>2006-09-16 10:43:17 +0000
commit2e387b9b852a5ae8c2980ff133e33d076004f6bf (patch)
treed6a32a6317a6d83082fb42a45340d13d9d9c56f0 /sbin/geom/class/eli/geom_eli.c
parentf5e129df20c2b3984d81e96cfffd8fe2979a18be (diff)
downloadFreeBSD-src-2e387b9b852a5ae8c2980ff133e33d076004f6bf.zip
FreeBSD-src-2e387b9b852a5ae8c2980ff133e33d076004f6bf.tar.gz
Add 'configure' subcommand which for now only allows setting and removing
of the BOOT flag. It can be performed on both attached and detached providers. Requested by: Matthias Lederhofer <matled@gmx.net> MFC after: 1 week
Diffstat (limited to 'sbin/geom/class/eli/geom_eli.c')
-rw-r--r--sbin/geom/class/eli/geom_eli.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/sbin/geom/class/eli/geom_eli.c b/sbin/geom/class/eli/geom_eli.c
index 3da4e83..0a82ccd 100644
--- a/sbin/geom/class/eli/geom_eli.c
+++ b/sbin/geom/class/eli/geom_eli.c
@@ -65,6 +65,7 @@ static char keyfile[] = "", newkeyfile[] = "";
static void eli_main(struct gctl_req *req, unsigned flags);
static void eli_init(struct gctl_req *req);
static void eli_attach(struct gctl_req *req);
+static void eli_configure(struct gctl_req *req);
static void eli_setkey(struct gctl_req *req);
static void eli_delkey(struct gctl_req *req);
static void eli_kill(struct gctl_req *req);
@@ -82,6 +83,7 @@ static void eli_dump(struct gctl_req *req);
* detach [-fl] prov ...
* stop - alias for 'detach'
* onetime [-d] [-a aalgo] [-e ealgo] [-l keylen] prov ...
+ * configure [-bB] prov ...
* setkey [-pPv] [-n keyno] [-k keyfile] [-K newkeyfile] prov
* delkey [-afv] [-n keyno] prov
* kill [-av] [prov ...]
@@ -156,6 +158,14 @@ struct g_command class_commands[] = {
},
"[-d] [-a aalgo] [-e ealgo] [-l keylen] [-s sectorsize] prov ..."
},
+ { "configure", G_FLAG_VERBOSE, eli_main,
+ {
+ { 'b', "boot", NULL, G_TYPE_NONE },
+ { 'B', "noboot", NULL, G_TYPE_NONE },
+ G_OPT_SENTINEL
+ },
+ "[-bB] prov ..."
+ },
{ "setkey", G_FLAG_VERBOSE, eli_main,
{
{ 'i', "iterations", &iterations, G_TYPE_NUMBER },
@@ -242,6 +252,8 @@ eli_main(struct gctl_req *req, unsigned flags)
eli_init(req);
else if (strcmp(name, "attach") == 0)
eli_attach(req);
+ else if (strcmp(name, "configure") == 0)
+ eli_configure(req);
else if (strcmp(name, "setkey") == 0)
eli_setkey(req);
else if (strcmp(name, "delkey") == 0)
@@ -666,6 +678,64 @@ eli_attach(struct gctl_req *req)
}
static void
+eli_configure_detached(struct gctl_req *req, const char *prov, int boot)
+{
+ struct g_eli_metadata md;
+
+ if (eli_metadata_read(req, prov, &md) == -1)
+ return;
+
+ if (boot && (md.md_flags & G_ELI_FLAG_BOOT)) {
+ if (verbose)
+ printf("BOOT flag already configured for %s.\n", prov);
+ } else if (!boot && !(md.md_flags & G_ELI_FLAG_BOOT)) {
+ if (verbose)
+ printf("BOOT flag not configured for %s.\n", prov);
+ } else {
+ if (boot)
+ md.md_flags |= G_ELI_FLAG_BOOT;
+ else
+ md.md_flags &= ~G_ELI_FLAG_BOOT;
+ eli_metadata_store(req, prov, &md);
+ }
+ bzero(&md, sizeof(md));
+}
+
+static void
+eli_configure(struct gctl_req *req)
+{
+ const char *prov;
+ int i, nargs, boot, noboot;
+
+ nargs = gctl_get_int(req, "nargs");
+ if (nargs == 0) {
+ gctl_error(req, "Too few arguments.");
+ return;
+ }
+
+ boot = gctl_get_int(req, "boot");
+ noboot = gctl_get_int(req, "noboot");
+
+ if (boot && noboot) {
+ gctl_error(req, "Options -b and -B are mutually exclusive.");
+ return;
+ }
+ if (!boot && !noboot) {
+ gctl_error(req, "No option given.");
+ return;
+ }
+
+ /* First attached providers. */
+ gctl_issue(req);
+ /* Now the rest. */
+ for (i = 0; i < nargs; i++) {
+ prov = gctl_get_ascii(req, "arg%d", i);
+ if (!eli_is_attached(prov))
+ eli_configure_detached(req, prov, boot);
+ }
+}
+
+static void
eli_setkey_attached(struct gctl_req *req, struct g_eli_metadata *md)
{
unsigned char key[G_ELI_USERKEYLEN];
OpenPOWER on IntegriCloud