diff options
| author | Johan Söllvander <js@FreeBSD.org> | 2025-12-18 15:06:09 +0000 |
|---|---|---|
| committer | Johan Söllvander <js@FreeBSD.org> | 2025-12-18 15:22:59 +0000 |
| commit | 4f809ffec69cd6ede3e7be9a5bc876b2e5931028 (patch) | |
| tree | e8631814adeed2606497ac54b05123843763a2fe | |
| parent | e3a0571ad74d8429a95fcae9efc1d91cc109a337 (diff) | |
gpart: add libxo support for "show" subcommand + man page updates
Added libxo support to `gpart show`, also updated the man
pages for geom and gpart to show where you can expect
libxo formatted output.
PR: 290629
MFC after: 1 week
Sponsored by: ConnectWise
Reviewed by: asomers, mckusick, phil
Approved by: asomers (mentor)
Differential Revision: https://reviews.freebsd.org/D53950
| -rw-r--r-- | lib/geom/part/Makefile | 2 | ||||
| -rw-r--r-- | lib/geom/part/geom_part.c | 94 | ||||
| -rw-r--r-- | lib/geom/part/gpart.8 | 11 | ||||
| -rw-r--r-- | sbin/geom/core/geom.8 | 12 |
4 files changed, 83 insertions, 36 deletions
diff --git a/lib/geom/part/Makefile b/lib/geom/part/Makefile index 58390e299d6f..4a273eca3a6d 100644 --- a/lib/geom/part/Makefile +++ b/lib/geom/part/Makefile @@ -2,6 +2,6 @@ PACKAGE=geom GEOM_CLASS= part -LIBADD= util +LIBADD= util xo .include <bsd.lib.mk> diff --git a/lib/geom/part/geom_part.c b/lib/geom/part/geom_part.c index cbbc81d3cc60..ac1bc25118f1 100644 --- a/lib/geom/part/geom_part.c +++ b/lib/geom/part/geom_part.c @@ -46,6 +46,7 @@ #include <string.h> #include <strings.h> #include <unistd.h> +#include <libxo/xo.h> #include "core/geom.h" #include "misc/subr.h" @@ -77,7 +78,6 @@ static int geom_is_withered(struct ggeom *); static const char *find_geomcfg(struct ggeom *, const char *); static const char *find_provcfg(struct gprovider *, const char *); static struct gprovider *find_provider(struct ggeom *, off_t); -static const char *fmtsize(int64_t); static int gpart_autofill(struct gctl_req *); static int gpart_autofill_resize(struct gctl_req *); static void gpart_bootcode(struct gctl_req *, unsigned int); @@ -284,16 +284,6 @@ find_provider(struct ggeom *gp, off_t minsector) } static const char * -fmtsize(int64_t rawsz) -{ - static char buf[5]; - - humanize_number(buf, sizeof(buf), rawsz, "", HN_AUTOSCALE, - HN_B | HN_NOSPACE | HN_DECIMAL); - return (buf); -} - -static const char * fmtattrib(struct gprovider *pp) { static char buf[128]; @@ -622,6 +612,7 @@ static void gpart_show_geom(struct ggeom *gp, const char *element, int show_providers) { struct gprovider *pp; + struct gconfig *gc; const char *s, *scheme; off_t first, last, sector, end; off_t length, secsz; @@ -659,12 +650,14 @@ gpart_show_geom(struct ggeom *gp, const char *element, int show_providers) wname = wmax; pp = LIST_FIRST(&gp->lg_consumer)->lg_provider; secsz = pp->lg_sectorsize; - printf("=>%*jd %*jd %*s %s (%s)%s\n", - wblocks, (intmax_t)first, wblocks, (intmax_t)(last - first + 1), - wname, gp->lg_name, - scheme, fmtsize(pp->lg_mediasize), - s ? " [CORRUPT]": ""); - + xo_open_instance("part"); + xo_emit("=>{t:start/%*jd} {t:sectors/%*jd} {t:name/%*s} {:scheme} ({h:size/%ld}){t:state}\n", + wblocks, (intmax_t)first, wblocks, (intmax_t)(last - first + 1), + wname, gp->lg_name, + scheme, pp->lg_mediasize, + s ? " [CORRUPT]": ""); + + xo_open_list("partitions"); while ((pp = find_provider(gp, first)) != NULL) { s = find_provcfg(pp, "start"); sector = (off_t)strtoimax(s, NULL, 0); @@ -676,33 +669,66 @@ gpart_show_geom(struct ggeom *gp, const char *element, int show_providers) s = find_provcfg(pp, "index"); idx = atoi(s); if (first < sector) { - printf(" %*jd %*jd %*s - free - (%s)\n", + xo_open_instance(s); + xo_emit(" {t:start/%*jd} {t:sectors/%*jd} {P:/%*s} {ne:free}- free - ({h:size/%ld})\n", wblocks, (intmax_t)first, wblocks, (intmax_t)(sector - first), wname, "", - fmtsize((sector - first) * secsz)); + "true", (sector - first) * secsz); + xo_close_instance(s); } + xo_open_instance(s); + xo_emit(" {t:start/%*jd} {t:sectors/%*jd}", + wblocks, (intmax_t)sector, wblocks, (intmax_t)length); if (show_providers) { - printf(" %*jd %*jd %*s %s %s (%s)\n", - wblocks, (intmax_t)sector, wblocks, - (intmax_t)length, wname, pp->lg_name, - find_provcfg(pp, element), fmtattrib(pp), - fmtsize(pp->lg_mediasize)); + xo_emit(" {t:name/%*s}{e:index/%d}", wname, pp->lg_name, idx); } else - printf(" %*jd %*jd %*d %s %s (%s)\n", - wblocks, (intmax_t)sector, wblocks, - (intmax_t)length, wname, idx, - find_provcfg(pp, element), fmtattrib(pp), - fmtsize(pp->lg_mediasize)); + xo_emit(" {t:index/%*d}{e:name}", wname, idx, pp->lg_name); + + if (strcmp(element, "label") == 0) + xo_emit(" {:label}{e:type}{e:rawtype}", + find_provcfg(pp, element), + find_provcfg(pp, "type"), + find_provcfg(pp, "rawtype")); + else if (strcmp(element, "type") == 0) + xo_emit(" {:type}{e:label}{e:rawtype}", + find_provcfg(pp, element), + find_provcfg(pp, "label"), + find_provcfg(pp, "rawtype")); + else + xo_emit(" {:rawtype}{e:type}{e:label}", + find_provcfg(pp, element), + find_provcfg(pp, "type"), + find_provcfg(pp, "label")); + + idx = 0; + LIST_FOREACH(gc, &pp->lg_config, lg_config) { + if (strcmp(gc->lg_name, "attrib") != 0) + continue; + idx++; + if (idx == 1) + xo_emit(" ["); + else + xo_emit(","); + xo_emit("{l:attribute}", gc->lg_val); + } + if (idx) + xo_emit("]"); + xo_emit(" ({h:size/%ld})\n", pp->lg_mediasize); + xo_close_instance(s); first = end + 1; } + if (first <= last) { + xo_open_instance("unallocated"); length = last - first + 1; - printf(" %*jd %*jd %*s - free - (%s)\n", + xo_emit(" {t:start/%*jd} {t:sectors/%*jd} {P:/%*s} {ne:free}- free - ({h:size/%ld})\n", wblocks, (intmax_t)first, wblocks, (intmax_t)length, - wname, "", - fmtsize(length * secsz)); + wname, "", "true", length * secsz); + xo_close_instance("unallocated"); } - printf("\n"); + xo_close_list("partitions"); + xo_close_instance("part"); + xo_emit("\n"); } static int @@ -752,6 +778,7 @@ gpart_show(struct gctl_req *req, unsigned int fl __unused) errx(EXIT_FAILURE, "Class %s not found.", name); } show_providers = gctl_get_int(req, "show_providers"); + xo_open_list(name); if (nargs > 0) { for (i = 0; i < nargs; i++) { name = gctl_get_ascii(req, "arg%d", i); @@ -766,6 +793,7 @@ gpart_show(struct gctl_req *req, unsigned int fl __unused) gpart_show_geom(gp, element, show_providers); } } + xo_close_list(name); geom_deletetree(&mesh); } diff --git a/lib/geom/part/gpart.8 b/lib/geom/part/gpart.8 index 2e11417f8494..97dd60182435 100644 --- a/lib/geom/part/gpart.8 +++ b/lib/geom/part/gpart.8 @@ -22,7 +22,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd October 24, 2025 +.Dd December 4, 2025 .Dt GPART 8 .Os .Sh NAME @@ -112,6 +112,7 @@ .Ar geom .\" ==== SHOW ==== .Nm +.Op Fl -libxo .Cm show .Op Fl l | r .Op Fl p @@ -537,6 +538,13 @@ See .It Cm unload See .Xr geom 8 . +.It Fl -libxo +Generate output via +.Xr libxo 3 +in a selection of different human and machine readable formats. +See +.Xr xo_options 7 +for details on command line arguments. .El .Sh PARTITIONING SCHEMES Several partitioning schemes are supported by the @@ -1519,6 +1527,7 @@ for details .El .Sh SEE ALSO .Xr geom 4 , +.Xr xo_options 7 , .Xr boot0cfg 8 , .Xr geom 8 , .Xr glabel 8 , diff --git a/sbin/geom/core/geom.8 b/sbin/geom/core/geom.8 index b864b3b238f5..29c6385da3f7 100644 --- a/sbin/geom/core/geom.8 +++ b/sbin/geom/core/geom.8 @@ -25,7 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd May 9, 2023 +.Dd December 4, 2025 .Dt GEOM 8 .Os .Sh NAME @@ -36,11 +36,13 @@ .Ar class .Cm help .Nm +.Op Fl -libxo .Ar class .Cm list .Op Fl a .Op Ar name ... .Nm +.Op Fl -libxo .Ar class .Cm status .Op Fl ags @@ -118,6 +120,13 @@ Print detailed information about the geom which provides .Ar provider-name . .It Fl t Display geoms hierarchy as a tree. +.It Fl -libxo +Generate output via +.Xr libxo 3 +in a selection of different human and machine readable formats. +See +.Xr xo_options 7 +for details on command line arguments. .El .Pp Class-specific commands are implemented as shared libraries which @@ -205,6 +214,7 @@ geom md unload .Sh SEE ALSO .Xr libgeom 3 , .Xr geom 4 , +.Xr xo_options 7 , .Xr gcache 8 , .Xr gconcat 8 , .Xr geli 8 , |
