summaryrefslogtreecommitdiffstats
path: root/sbin/geom/core/geom.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/geom/core/geom.c')
-rw-r--r--sbin/geom/core/geom.c117
1 files changed, 71 insertions, 46 deletions
diff --git a/sbin/geom/core/geom.c b/sbin/geom/core/geom.c
index 4a2d1cc..12959a3 100644
--- a/sbin/geom/core/geom.c
+++ b/sbin/geom/core/geom.c
@@ -548,57 +548,88 @@ find_class(struct gmesh *mesh, const char *name)
return (NULL);
}
-static struct gprovider *
-find_provider(struct gclass *classp, const char *name)
+static struct ggeom *
+find_geom(struct gclass *classp, const char *name)
{
struct ggeom *gp;
- struct gprovider *pp;
LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
- LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
- if (strcmp(pp->lg_name, name) == 0)
- return (pp);
- }
+ if (strcmp(gp->lg_name, name) == 0)
+ return (gp);
}
return (NULL);
}
-static char *
-genspaces(const char *text, size_t len)
+static void
+show_one_provider(struct gprovider *pp, const char *prefix)
{
- static char spaces[256];
- size_t outlen;
+ struct gconfig *conf;
+ char buf[5];
+
+ printf("Name: %s\n", pp->lg_name);
+ humanize_number(buf, sizeof(buf), (int64_t)pp->lg_mediasize, "",
+ HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
+ printf("%sMediasize: %jd (%s)\n", prefix, (intmax_t)pp->lg_mediasize,
+ buf);
+ printf("%sSectorsize: %u\n", prefix, pp->lg_sectorsize);
+ printf("%sMode: %s\n", prefix, pp->lg_mode);
+ LIST_FOREACH(conf, &pp->lg_config, lg_config) {
+ printf("%s%s: %s\n", prefix, conf->lg_name, conf->lg_val);
+ }
+}
+
+static void
+show_one_consumer(struct gconsumer *cp, const char *prefix)
+{
+ struct gprovider *pp;
+ struct gconfig *conf;
- if (strlen(text) >= len) {
- spaces[0] = '\0';
- return (spaces);
+ pp = cp->lg_provider;
+ if (pp == NULL)
+ printf("[no provider]\n");
+ else {
+ char buf[5];
+
+ printf("Name: %s\n", pp->lg_name);
+ humanize_number(buf, sizeof(buf), (int64_t)pp->lg_mediasize, "",
+ HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
+ printf("%sMediasize: %jd (%s)\n", prefix,
+ (intmax_t)pp->lg_mediasize, buf);
+ printf("%sSectorsize: %u\n", prefix, pp->lg_sectorsize);
+ printf("%sMode: %s\n", prefix, cp->lg_mode);
}
- memset(spaces, ' ', sizeof(spaces));
- outlen = len - strlen(text);
- if (outlen >= sizeof(spaces)) {
- spaces[sizeof(spaces) - 1] = '\0';
- return (spaces);
+ LIST_FOREACH(conf, &cp->lg_config, lg_config) {
+ printf("%s%s: %s\n", prefix, conf->lg_name, conf->lg_val);
}
- spaces[outlen] = '\0';
- return (spaces);
}
static void
-show_one(struct gprovider *pp)
+show_one_geom(struct ggeom *gp)
{
+ struct gprovider *pp;
+ struct gconsumer *cp;
struct gconfig *conf;
- char buf[5];
+ unsigned n;
- printf(" NAME: %s\n", pp->lg_name);
- printf(" geom name: %s\n", pp->lg_geom->lg_name);
- humanize_number(buf, sizeof(buf), (int64_t)pp->lg_mediasize, "",
- HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
- printf(" mediasize: %jd (%s)\n", (intmax_t)pp->lg_mediasize, buf);
- printf(" sectorsize: %u\n", pp->lg_sectorsize);
- printf(" mode: %s\n", pp->lg_mode);
- LIST_FOREACH(conf, &pp->lg_config, lg_config) {
- printf("%s%s: %s\n", genspaces(conf->lg_name, 11),
- conf->lg_name, conf->lg_val);
+ printf("Geom name: %s\n", gp->lg_name);
+ LIST_FOREACH(conf, &gp->lg_config, lg_config) {
+ printf("%s: %s\n", conf->lg_name, conf->lg_val);
+ }
+ if (!LIST_EMPTY(&gp->lg_provider)) {
+ printf("Providers:\n");
+ n = 1;
+ LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
+ printf("%u. ", n++);
+ show_one_provider(pp, " ");
+ }
+ }
+ if (!LIST_EMPTY(&gp->lg_consumer)) {
+ printf("Consumers:\n");
+ n = 1;
+ LIST_FOREACH(cp, &gp->lg_consumer, lg_consumer) {
+ printf("%u. ", n++);
+ show_one_consumer(cp, " ");
+ }
}
printf("\n");
}
@@ -632,7 +663,7 @@ std_list(struct gctl_req *req, unsigned flags __unused)
{
struct gmesh mesh;
struct gclass *classp;
- struct gprovider *pp;
+ struct ggeom *gp;
int error, *nargs;
error = geom_gettree(&mesh);
@@ -660,21 +691,15 @@ std_list(struct gctl_req *req, unsigned flags __unused)
snprintf(param, sizeof(param), "arg%d", i);
name = gctl_get_asciiparam(req, param);
assert(name != NULL);
- pp = find_provider(classp, name);
- if (pp != NULL)
- show_one(pp);
- else {
- fprintf(stderr, "No such provider: %s.\n",
- name);
- }
+ gp = find_geom(classp, name);
+ if (gp != NULL)
+ show_one_geom(gp);
+ else
+ fprintf(stderr, "No such geom: %s.\n", name);
}
} else {
- struct ggeom *gp;
-
LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
- LIST_FOREACH(pp, &gp->lg_provider, lg_provider) {
- show_one(pp);
- }
+ show_one_geom(gp);
}
}
geom_deletetree(&mesh);
OpenPOWER on IntegriCloud