Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Dec 2025 15:23:29 +0000
From:      Johan=?utf-8?Q? S=C3=B6llv?=ander <js@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 4f809ffec69c - main - gpart: add libxo support for "show" subcommand + man page updates
Message-ID:  <69441c71.3cabf.277d1ceb@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by js:

URL: https://cgit.FreeBSD.org/src/commit/?id=4f809ffec69cd6ede3e7be9a5bc876b2e5931028

commit 4f809ffec69cd6ede3e7be9a5bc876b2e5931028
Author:     Johan Söllvander <js@FreeBSD.org>
AuthorDate: 2025-12-18 15:06:09 +0000
Commit:     Johan Söllvander <js@FreeBSD.org>
CommitDate: 2025-12-18 15:22:59 +0000

    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
---
 lib/geom/part/Makefile    |  2 +-
 lib/geom/part/geom_part.c | 94 ++++++++++++++++++++++++++++++-----------------
 lib/geom/part/gpart.8     | 11 +++++-
 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);
@@ -283,16 +283,6 @@ find_provider(struct ggeom *gp, off_t minsector)
 	return (bestpp);
 }
 
-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)
 {
@@ -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 ,


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69441c71.3cabf.277d1ceb>