git: 68bff4a07e3f - main - Allow GEOM utilities to specify a -v option.
Date: Fri, 29 Oct 2021 05:52:24 UTC
The branch main has been updated by mckusick: URL: https://cgit.FreeBSD.org/src/commit/?id=68bff4a07e3fa6c30a0c0ff6cf5f0bef95dcbd72 commit 68bff4a07e3fa6c30a0c0ff6cf5f0bef95dcbd72 Author: Kirk McKusick <mckusick@FreeBSD.org> AuthorDate: 2021-10-29 05:49:48 +0000 Commit: Kirk McKusick <mckusick@FreeBSD.org> CommitDate: 2021-10-29 05:50:50 +0000 Allow GEOM utilities to specify a -v option. Geom utilities (geli(8), glabel(8), gmirror(8), gpart(8), gmirror(8), gmountver(8), etc) all use the geom(8) utility as their back end to process their commands and pass them into the kernel. Creating a new utility requires no more than filling out a template describing the commands and arguments that the utility supports. Consider the specification for the very simple gmountver(8) utility: struct g_command class_commands[] = { { "create", G_FLAG_VERBOSE | G_FLAG_LOADKLD, NULL, { G_OPT_SENTINEL }, "[-v] prov ..." }, { "destroy", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, "[-fv] name" }, G_CMD_SENTINEL }; It has just two commands of its own: "create" and "destroy" along with the four standard commands "list", "status", "load", and "unload" provided by the base geom(8) utility. The base geom(8) utility allows each command to use the G_FLAG_VERBOSE flag to specify that a command should accept the -v flag and when the -v flag is given the utility prints "Done." if the command completes successfully. In the above example, both of the commands set the G_FLAG_VERBOSE, so have the -v option available. In addition the "destroy" command accepts the -f boolean flag to force the destruction. If the "destroy" command wanted to also print out verbose information, it would need to explicitly declare its intent by adding a line: { 'v', "verbose", NULL, G_TYPE_BOOL }, Before this change, the geom utility would silently ignore the above line in the configuration file, so it was impossible for the utility to know that the -v flag had been set on the command. With this change a geom command can explicitly specify a -v option with a line as given above and handle it as it would any other option. If both a -v option and G_FLAG_VERBOSE are specified for a command then both types of verbose information will be output when that command is run with -v. MFC after: 1 week Sponsored by: Netflix --- sbin/geom/core/geom.c | 19 ++++++++++++------- sbin/geom/core/geom.h | 13 +++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/sbin/geom/core/geom.c b/sbin/geom/core/geom.c index 58b33a067700..2e0d8683df49 100644 --- a/sbin/geom/core/geom.c +++ b/sbin/geom/core/geom.c @@ -314,7 +314,7 @@ parse_arguments(struct g_command *cmd, struct gctl_req *req, int *argc, struct g_option *opt; char opts[64]; unsigned i; - int ch; + int ch, vcount; *opts = '\0'; if ((cmd->gc_flags & G_FLAG_VERBOSE) != 0) @@ -336,17 +336,22 @@ parse_arguments(struct g_command *cmd, struct gctl_req *req, int *argc, /* * Add specified arguments. */ + vcount = 0; while ((ch = getopt(*argc, *argv, opts)) != -1) { /* Standard (not passed to kernel) options. */ - switch (ch) { - case 'v': + if (ch == 'v' && (cmd->gc_flags & G_FLAG_VERBOSE) != 0) verbose = 1; - continue; - } /* Options passed to kernel. */ opt = find_option(cmd, ch); - if (opt == NULL) + if (opt == NULL) { + if (ch == 'v' && (cmd->gc_flags & G_FLAG_VERBOSE) != 0){ + if (++vcount < 2) + continue; + else + warnx("Option 'v' specified twice."); + } usage(); + } if (!G_OPT_ISMULTI(opt) && G_OPT_ISDONE(opt)) { warnx("Option '%c' specified twice.", opt->go_char); usage(); @@ -440,7 +445,7 @@ set_flags(struct g_command *cmd) { unsigned flags = 0; - if ((cmd->gc_flags & G_FLAG_VERBOSE) != 0 && verbose) + if ((cmd->gc_flags & G_FLAG_VERBOSE) != 0) flags |= G_FLAG_VERBOSE; return (flags); diff --git a/sbin/geom/core/geom.h b/sbin/geom/core/geom.h index 89c5828c6429..38a99032f692 100644 --- a/sbin/geom/core/geom.h +++ b/sbin/geom/core/geom.h @@ -32,6 +32,19 @@ #define _GEOM_H_ #define G_LIB_VERSION 5 +/* + * The G_FLAG_VERBOSE flag on a command specification means that the + * comand will accept a -v option and the GEOM framework will print + * out status information after the command when it is run with -v. + * Additionally a GEOM command can explicitly specify a -v option and + * handle it as it would any other option. If both a -v option and + * G_FLAG_VERBOSE are specified for a command then both types of verbose + * information will be output when that command is run with -v. + * + * When the G_FLAG_LOADKLD is specified for a command, the GEOM kernel + * module will be loaded when that command is run if it has not yet been + * loaded. This flag is typically specified for the `create' command. + */ #define G_FLAG_NONE 0x0000 #define G_FLAG_VERBOSE 0x0001 #define G_FLAG_LOADKLD 0x0002