git: 76df3f6f3680 - stable/14 - gpart: add libxo support for "show" subcommand + man page updates
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 05 Jan 2026 14:48:27 UTC
The branch stable/14 has been updated by js:
URL: https://cgit.FreeBSD.org/src/commit/?id=76df3f6f3680556c777e2e13565c9e217c12d5b1
commit 76df3f6f3680556c777e2e13565c9e217c12d5b1
Author: Johan Söllvander <js@FreeBSD.org>
AuthorDate: 2025-12-18 15:06:09 +0000
Commit: Johan Söllvander <js@FreeBSD.org>
CommitDate: 2026-01-05 14:47:18 +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
Sponsored by: ConnectWise
Reviewed by: asomers, mckusick, phil
Approved by: asomers (mentor)
Differential Revision: https://reviews.freebsd.org/D53950
(cherry picked from commit 4f809ffec69cd6ede3e7be9a5bc876b2e5931028)
geom_part: Fix format string issues
This fixes a segfault on i386 and armv7 and numerous style violations.
PR: 292008
Fixes: 4f809ffec69c ("gpart: add libxo support for "show" subcommand + man page updates")
Reviewed by: js
Differential Revision: https://reviews.freebsd.org/D54393
(cherry picked from commit faff7013187b03f4240af6f52f608e7ebafe19f3)
---
lib/geom/part/Makefile | 2 +-
lib/geom/part/geom_part.c | 107 +++++++++++++++++++++++++++++++---------------
lib/geom/part/gpart.8 | 11 ++++-
sbin/geom/core/geom.8 | 12 +++++-
4 files changed, 95 insertions(+), 37 deletions(-)
diff --git a/lib/geom/part/Makefile b/lib/geom/part/Makefile
index 00840df1da23..cb507bd1ba1b 100644
--- a/lib/geom/part/Makefile
+++ b/lib/geom/part/Makefile
@@ -4,6 +4,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..852eec2d790a 100644
--- a/lib/geom/part/geom_part.c
+++ b/lib/geom/part/geom_part.c
@@ -47,6 +47,8 @@
#include <strings.h>
#include <unistd.h>
+#include <libxo/xo.h>
+
#include "core/geom.h"
#include "misc/subr.h"
@@ -77,7 +79,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 +284,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 +613,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 +651,15 @@ 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",
+ xo_open_instance("part");
+ xo_emit("=>{t:start/%*jd} {t:sectors/%*jd} "
+ "{t:name/%*s} {:scheme} ({h:size/%jd})"
+ "{t:state}\n",
wblocks, (intmax_t)first, wblocks, (intmax_t)(last - first + 1),
- wname, gp->lg_name,
- scheme, fmtsize(pp->lg_mediasize),
+ wname, gp->lg_name, scheme, (intmax_t)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 +671,75 @@ 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",
- wblocks, (intmax_t)first, wblocks,
- (intmax_t)(sector - first), wname, "",
- fmtsize((sector - first) * secsz));
+ xo_open_instance(s);
+ xo_emit(" {t:start/%*jd} "
+ "{t:sectors/%*jd} "
+ "{P:/%*s} "
+ "{ne:free}- free - ({h:size/%jd})\n",
+ wblocks, (intmax_t)first,
+ wblocks, (intmax_t)(sector - first),
+ wname, "",
+ "true", (intmax_t)(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));
- } 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:name/%*s}{e:index/%d}",
+ wname, pp->lg_name, idx);
+ } else {
+ 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/%jd})\n", (intmax_t)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/%jd})\n",
wblocks, (intmax_t)first, wblocks, (intmax_t)length,
- wname, "",
- fmtsize(length * secsz));
+ wname, "", "true", (intmax_t)length * secsz);
+ xo_close_instance("unallocated");
}
- printf("\n");
+ xo_close_list("partitions");
+ xo_close_instance("part");
+ xo_emit("\n");
}
static int
@@ -752,6 +789,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 +804,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);
}
@@ -1084,7 +1123,7 @@ gpart_bootfile_read(const char *bootfile, ssize_t *size)
if (sb.st_size == 0)
errx(EXIT_FAILURE, "%s: empty file", bootfile);
if (*size > 0 && sb.st_size > *size)
- errx(EXIT_FAILURE, "%s: file too big (%zu limit)", bootfile,
+ errx(EXIT_FAILURE, "%s: file too big (%zd limit)", bootfile,
*size);
*size = sb.st_size;
diff --git a/lib/geom/part/gpart.8 b/lib/geom/part/gpart.8
index 176499c0d1e3..8184af912583 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
@@ -1528,6 +1536,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 7f0f0b2911b3..15d87b922f61 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
@@ -207,6 +216,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 ,