Date: Thu, 13 Sep 2018 14:06:02 +0000 (UTC) From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r338640 - head/sbin/geom/core Message-ID: <201809131406.w8DE62Tb037564@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: trasz Date: Thu Sep 13 14:06:01 2018 New Revision: 338640 URL: https://svnweb.freebsd.org/changeset/base/338640 Log: Add new option to the geom(8) utility, "-p". It makes it easy to look up the GEOM class instance from the provider name. Reviewed by: oshogbo, 0mp Approved by: re (kib) MFC after: 2 weeks Relnotes: yes Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D17116 Modified: head/sbin/geom/core/geom.8 head/sbin/geom/core/geom.c Modified: head/sbin/geom/core/geom.8 ============================================================================== --- head/sbin/geom/core/geom.8 Thu Sep 13 13:57:42 2018 (r338639) +++ head/sbin/geom/core/geom.8 Thu Sep 13 14:06:01 2018 (r338640) @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 5, 2011 +.Dd September 13, 2018 .Dt GEOM 8 .Os .Sh NAME @@ -52,6 +52,9 @@ .Ar class .Cm unload .Op Fl v +.Nm +.Fl p +.Ar provider-name .Sh DESCRIPTION The .Nm @@ -101,6 +104,13 @@ sysctl. Unload the kernel module which implements the given class. This command is only available if the given class is loaded as a kernel module. +.El +.Pp +Additional options include: +.Bl -tag -width ".Cm status" +.It Fl p Ar provider-name +Print detailed information about the geom which provides +.Ar provider-name . .El .Pp Class-specific commands are implemented as shared libraries which Modified: head/sbin/geom/core/geom.c ============================================================================== --- head/sbin/geom/core/geom.c Thu Sep 13 13:57:42 2018 (r338639) +++ head/sbin/geom/core/geom.c Thu Sep 13 14:06:01 2018 (r338640) @@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$"); #include <stdio.h> #include <stdlib.h> #include <stdarg.h> +#include <stdbool.h> #include <stdint.h> #include <string.h> #include <unistd.h> @@ -68,6 +69,7 @@ static struct g_command *class_commands = NULL; #define GEOM_CLASS_CMDS 0x01 #define GEOM_STD_CMDS 0x02 static struct g_command *find_command(const char *cmdstr, int flags); +static void list_one_geom_by_provider(const char *provider_name); static int std_available(const char *name); static void std_help(struct gctl_req *req, unsigned flags); @@ -146,6 +148,7 @@ usage(void) if (class_name == NULL) { fprintf(stderr, "usage: geom <class> <command> [options]\n"); + fprintf(stderr, " geom -p <provider-name>\n"); exit(EXIT_FAILURE); } else { struct g_command *cmd; @@ -650,10 +653,57 @@ get_class(int *argc, char ***argv) usage(); } +static struct ggeom * +find_geom_by_provider(struct gmesh *mesh, const char *name) +{ + struct gclass *classp; + struct ggeom *gp; + struct gprovider *pp; + + LIST_FOREACH(classp, &mesh->lg_class, lg_class) { + LIST_FOREACH(gp, &classp->lg_geom, lg_geom) { + LIST_FOREACH(pp, &gp->lg_provider, lg_provider) { + if (strcmp(pp->lg_name, name) == 0) + return (gp); + } + } + } + + return (NULL); +} + int main(int argc, char *argv[]) { + char *provider_name; + int ch; + provider_name = NULL; + + if (strcmp(getprogname(), "geom") == 0) { + while ((ch = getopt(argc, argv, "hp:")) != -1) { + switch (ch) { + case 'p': + provider_name = strdup(optarg); + if (provider_name == NULL) + err(1, "strdup"); + break; + case 'h': + default: + usage(); + } + } + + /* + * Don't adjust argc and argv, it would break get_class(). + */ + } + + if (provider_name != NULL) { + list_one_geom_by_provider(provider_name); + return (0); + } + get_class(&argc, &argv); run_command(argc, argv); /* NOTREACHED */ @@ -765,6 +815,25 @@ list_one_geom(struct ggeom *gp) } } printf("\n"); +} + +static void +list_one_geom_by_provider(const char *provider_name) +{ + struct gmesh mesh; + struct ggeom *gp; + int error; + + error = geom_gettree(&mesh); + if (error != 0) + errc(EXIT_FAILURE, error, "Cannot get GEOM tree"); + + gp = find_geom_by_provider(&mesh, provider_name); + if (gp == NULL) + errx(EXIT_FAILURE, "Cannot find provider '%s'.", provider_name); + + printf("Geom class: %s\n", gp->lg_class->lg_name); + list_one_geom(gp); } static void
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201809131406.w8DE62Tb037564>