mirror of
https://git.freebsd.org/src.git
synced 2026-01-11 19:57:22 +00:00
gpart: add libxo support for "show" subcommand + man page updates
Some checks are pending
Cross-build Kernel / amd64 ubuntu-22.04 (clang-15) (push) Waiting to run
Cross-build Kernel / aarch64 ubuntu-22.04 (clang-15) (push) Waiting to run
Cross-build Kernel / amd64 ubuntu-24.04 (clang-18) (push) Waiting to run
Cross-build Kernel / aarch64 ubuntu-24.04 (clang-18) (push) Waiting to run
Cross-build Kernel / amd64 macos-latest (clang-18) (push) Waiting to run
Cross-build Kernel / aarch64 macos-latest (clang-18) (push) Waiting to run
Some checks are pending
Cross-build Kernel / amd64 ubuntu-22.04 (clang-15) (push) Waiting to run
Cross-build Kernel / aarch64 ubuntu-22.04 (clang-15) (push) Waiting to run
Cross-build Kernel / amd64 ubuntu-24.04 (clang-18) (push) Waiting to run
Cross-build Kernel / aarch64 ubuntu-24.04 (clang-18) (push) Waiting to run
Cross-build Kernel / amd64 macos-latest (clang-18) (push) Waiting to run
Cross-build Kernel / aarch64 macos-latest (clang-18) (push) Waiting to run
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
This commit is contained in:
parent
e3a0571ad7
commit
4f809ffec6
4 changed files with 82 additions and 35 deletions
|
|
@ -2,6 +2,6 @@ PACKAGE=geom
|
|||
|
||||
GEOM_CLASS= part
|
||||
|
||||
LIBADD= util
|
||||
LIBADD= util xo
|
||||
|
||||
.include <bsd.lib.mk>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ,
|
||||
|
|
|
|||
|
|
@ -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 ,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue