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
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to