mirror of
https://git.freebsd.org/src.git
synced 2026-01-11 19:57:22 +00:00
Revert "devinfo: Add support for libxo"
This broke the human output formatting in several ways. This reverts commit4cf5878d27. This reverts commite8d6b58ef5. This reverts commitc759aca606. PR: 291511 Reviewed by: imp, des Differential Revision: https://reviews.freebsd.org/D54196
This commit is contained in:
parent
cae9ae66ad
commit
43b07bdbc5
3 changed files with 39 additions and 193 deletions
|
|
@ -2,6 +2,6 @@ PACKAGE= devmatch
|
|||
PROG= devinfo
|
||||
MAN= devinfo.8
|
||||
|
||||
LIBADD= xo devinfo
|
||||
LIBADD= devinfo
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
|
|
|||
|
|
@ -34,13 +34,10 @@
|
|||
.Nd print information about system device configuration
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl -libxo
|
||||
.Op Fl rv
|
||||
.Nm
|
||||
.Op Fl -libxo
|
||||
.Fl p Ar dev Op Fl v
|
||||
.Nm
|
||||
.Op Fl -libxo
|
||||
.Fl u Op Fl v
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
|
|
@ -51,14 +48,7 @@ in the system, starting from the
|
|||
device.
|
||||
.Pp
|
||||
The following options are accepted:
|
||||
.Bl -tag -width "--libxo"
|
||||
.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.
|
||||
.Bl -tag -width indent
|
||||
.It Fl p Ar dev
|
||||
Display the path of
|
||||
.Ar dev
|
||||
|
|
@ -83,8 +73,6 @@ This flag also displays verbose information about each device.
|
|||
.Sh SEE ALSO
|
||||
.Xr systat 1 ,
|
||||
.Xr devinfo 3 ,
|
||||
.Xr libxo 3 ,
|
||||
.Xr xo_options 7 ,
|
||||
.Xr devctl 8 ,
|
||||
.Xr iostat 8 ,
|
||||
.Xr pciconf 8 ,
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@
|
|||
* Copyright (c) 2000, 2001 Michael Smith
|
||||
* Copyright (c) 2000 BSDi
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2024 KT Ullavik
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
|
|
@ -41,18 +40,12 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <libxo/xo.h>
|
||||
#include "devinfo.h"
|
||||
|
||||
static bool rflag;
|
||||
static bool vflag;
|
||||
static int open_tag_count;
|
||||
static char *last_res;
|
||||
|
||||
static void print_indent(int);
|
||||
static void print_kvlist(char *);
|
||||
static char* xml_safe_string(char *);
|
||||
static void print_resource(struct devinfo_res *);
|
||||
static int print_device_matching_resource(struct devinfo_res *, void *);
|
||||
static int print_device_rman_resources(struct devinfo_rman *, void *);
|
||||
|
|
@ -81,46 +74,7 @@ print_indent(int n)
|
|||
n = MIN((size_t)n, sizeof(buffer) - 1);
|
||||
memset(buffer, ' ', n);
|
||||
buffer[n] = '\0';
|
||||
xo_emit("{Pa:%s}", buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Takes a list of key-value pairs in the form
|
||||
* "key1=val1 key2=val2 ..." and prints them according
|
||||
* to xo formatting.
|
||||
*/
|
||||
static void
|
||||
print_kvlist(char *s)
|
||||
{
|
||||
char *kv;
|
||||
char *copy;
|
||||
|
||||
if ((copy = strdup(s)) == NULL)
|
||||
xo_err(1, "No memory!");
|
||||
|
||||
while ((kv = strsep(©, " ")) != NULL) {
|
||||
char* k = strsep(&kv, "=");
|
||||
xo_emit("{ea:%s/%s} {d:key/%s}={d:value/%s}", k, kv, k, kv);
|
||||
}
|
||||
free(copy);
|
||||
}
|
||||
|
||||
static char
|
||||
*xml_safe_string(char *desc)
|
||||
{
|
||||
int i;
|
||||
char *s;
|
||||
|
||||
if ((s = strdup(desc)) == NULL) {
|
||||
xo_err(1, "No memory!");
|
||||
}
|
||||
|
||||
for (i=0; s[i] != '\0'; i++) {
|
||||
if (s[i] == ' ' || s[i] == '/') {
|
||||
s[i] = '-';
|
||||
}
|
||||
}
|
||||
return s;
|
||||
printf("%s", buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -132,28 +86,20 @@ print_resource(struct devinfo_res *res)
|
|||
struct devinfo_rman *rman;
|
||||
bool hexmode;
|
||||
rman_res_t end;
|
||||
char *safe_desc;
|
||||
|
||||
rman = devinfo_handle_to_rman(res->dr_rman);
|
||||
hexmode = (rman->dm_size > 1000) || (rman->dm_size == 0);
|
||||
end = res->dr_start + res->dr_size - 1;
|
||||
|
||||
safe_desc = xml_safe_string(rman->dm_desc);
|
||||
xo_open_instance(safe_desc);
|
||||
|
||||
if (hexmode) {
|
||||
xo_emit("{:start/0x%jx}", res->dr_start);
|
||||
printf("0x%jx", res->dr_start);
|
||||
if (res->dr_size > 1)
|
||||
xo_emit("{D:-}{d:end/0x%jx}", end);
|
||||
xo_emit("{e:end/0x%jx}", end);
|
||||
printf("-0x%jx", end);
|
||||
} else {
|
||||
xo_emit("{:start/%ju}", res->dr_start);
|
||||
printf("%ju", res->dr_start);
|
||||
if (res->dr_size > 1)
|
||||
xo_emit("{D:-}{d:end/%ju}", end);
|
||||
xo_emit("{e:end/%ju}", end);
|
||||
printf("-%ju", end);
|
||||
}
|
||||
xo_close_instance(safe_desc);
|
||||
free(safe_desc);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -175,7 +121,7 @@ print_device_matching_resource(struct devinfo_res *res, void *arg)
|
|||
return(1);
|
||||
print_indent(ia->indent);
|
||||
print_resource(res);
|
||||
xo_emit("\n");
|
||||
printf("\n");
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
|
@ -188,7 +134,6 @@ print_device_rman_resources(struct devinfo_rman *rman, void *arg)
|
|||
{
|
||||
struct indent_arg *ia = (struct indent_arg *)arg;
|
||||
int indent;
|
||||
char *safe_desc;
|
||||
|
||||
indent = ia->indent;
|
||||
|
||||
|
|
@ -198,18 +143,13 @@ print_device_rman_resources(struct devinfo_rman *rman, void *arg)
|
|||
print_device_matching_resource, ia) != 0) {
|
||||
|
||||
/* there are, print header */
|
||||
safe_desc = xml_safe_string(rman->dm_desc);
|
||||
print_indent(indent);
|
||||
xo_emit("<{:description/%s}>\n", rman->dm_desc);
|
||||
xo_open_list(safe_desc);
|
||||
printf("%s:\n", rman->dm_desc);
|
||||
|
||||
/* print resources */
|
||||
ia->indent = indent + 4;
|
||||
devinfo_foreach_rman_resource(rman,
|
||||
print_device_matching_resource, ia);
|
||||
|
||||
xo_close_list(safe_desc);
|
||||
free(safe_desc);
|
||||
}
|
||||
ia->indent = indent;
|
||||
return(0);
|
||||
|
|
@ -220,39 +160,20 @@ print_device_props(struct devinfo_dev *dev)
|
|||
{
|
||||
if (vflag) {
|
||||
if (*dev->dd_desc) {
|
||||
xo_emit("<{:description/%s}>", dev->dd_desc);
|
||||
printf(" <%s>", dev->dd_desc);
|
||||
}
|
||||
if (*dev->dd_pnpinfo) {
|
||||
xo_open_container("pnpinfo");
|
||||
xo_emit("{D: pnpinfo}");
|
||||
|
||||
if ((strcmp(dev->dd_pnpinfo, "unknown") == 0))
|
||||
xo_emit("{D: unknown}");
|
||||
else
|
||||
print_kvlist(dev->dd_pnpinfo);
|
||||
|
||||
xo_close_container("pnpinfo");
|
||||
printf(" pnpinfo %s", dev->dd_pnpinfo);
|
||||
}
|
||||
if (*dev->dd_location) {
|
||||
xo_open_container("location");
|
||||
xo_emit("{D: at}");
|
||||
print_kvlist(dev->dd_location);
|
||||
xo_close_container("location");
|
||||
printf(" at %s", dev->dd_location);
|
||||
}
|
||||
|
||||
// If verbose, then always print state for json/xml.
|
||||
if (!(dev->dd_flags & DF_ENABLED))
|
||||
xo_emit("{e:state/disabled}");
|
||||
else if (dev->dd_flags & DF_SUSPENDED)
|
||||
xo_emit("{e:state/suspended}");
|
||||
else
|
||||
xo_emit("{e:state/enabled}");
|
||||
}
|
||||
|
||||
if (!(dev->dd_flags & DF_ENABLED))
|
||||
xo_emit("{D: (disabled)}");
|
||||
printf(" (disabled)");
|
||||
else if (dev->dd_flags & DF_SUSPENDED)
|
||||
xo_emit("{D: (suspended)}");
|
||||
printf(" (suspended)");
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -262,20 +183,16 @@ static int
|
|||
print_device(struct devinfo_dev *dev, void *arg)
|
||||
{
|
||||
struct indent_arg ia;
|
||||
int indent, ret;
|
||||
const char* devname = dev->dd_name[0] ? dev->dd_name : "unknown";
|
||||
int indent;
|
||||
bool printit = vflag || (dev->dd_name[0] != 0 &&
|
||||
dev->dd_state >= DS_ATTACHED);
|
||||
|
||||
if (printit) {
|
||||
indent = (int)(intptr_t)arg;
|
||||
print_indent(indent);
|
||||
|
||||
xo_open_container(devname);
|
||||
xo_emit("{d:devicename/%s}", devname);
|
||||
|
||||
printf("%s", dev->dd_name[0] ? dev->dd_name : "unknown");
|
||||
print_device_props(dev);
|
||||
xo_emit("\n");
|
||||
printf("\n");
|
||||
if (rflag) {
|
||||
ia.indent = indent + 4;
|
||||
ia.arg = dev;
|
||||
|
|
@ -284,13 +201,8 @@ print_device(struct devinfo_dev *dev, void *arg)
|
|||
}
|
||||
}
|
||||
|
||||
ret = (devinfo_foreach_device_child(dev, print_device,
|
||||
return(devinfo_foreach_device_child(dev, print_device,
|
||||
(void *)((char *)arg + 2)));
|
||||
|
||||
if (printit) {
|
||||
xo_close_container(devname);
|
||||
}
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -302,7 +214,6 @@ print_rman_resource(struct devinfo_res *res, void *arg __unused)
|
|||
struct devinfo_dev *dev;
|
||||
struct devinfo_rman *rman;
|
||||
rman_res_t end;
|
||||
char *res_str, *entry = NULL;
|
||||
bool hexmode;
|
||||
|
||||
dev = devinfo_handle_to_device(res->dr_device);
|
||||
|
|
@ -310,38 +221,24 @@ print_rman_resource(struct devinfo_res *res, void *arg __unused)
|
|||
hexmode = (rman->dm_size > 1000) || (rman->dm_size == 0);
|
||||
end = res->dr_start + res->dr_size - 1;
|
||||
|
||||
printf(" ");
|
||||
|
||||
if (hexmode) {
|
||||
if (res->dr_size > 1)
|
||||
asprintf(&res_str, "0x%jx-0x%jx", res->dr_start, end);
|
||||
printf("0x%jx-0x%jx", res->dr_start, end);
|
||||
else
|
||||
asprintf(&res_str, "0x%jx", res->dr_start);
|
||||
printf("0x%jx", res->dr_start);
|
||||
} else {
|
||||
if (res->dr_size > 1)
|
||||
asprintf(&res_str, "%ju-%ju", res->dr_start, end);
|
||||
printf("%ju-%ju", res->dr_start, end);
|
||||
else
|
||||
asprintf(&res_str, "%ju", res->dr_start);
|
||||
}
|
||||
|
||||
xo_emit("{P: }");
|
||||
|
||||
if (last_res == NULL) {
|
||||
// First resource
|
||||
xo_open_list(res_str);
|
||||
} else if (strcmp(res_str, last_res) != 0) {
|
||||
// We can't repeat json keys. So we keep an
|
||||
// open list from the last iteration and only
|
||||
// create a new list when see a new resource.
|
||||
xo_close_list(last_res);
|
||||
xo_open_list(res_str);
|
||||
printf("%ju", res->dr_start);
|
||||
}
|
||||
|
||||
dev = devinfo_handle_to_device(res->dr_device);
|
||||
if (dev != NULL) {
|
||||
if (dev->dd_name[0] != 0) {
|
||||
printf(" (%s)", dev->dd_name);
|
||||
asprintf(&entry, "{el:%s}{D:%s} {D:(%s)}\n",
|
||||
res_str, res_str, dev->dd_name);
|
||||
xo_emit(entry, dev->dd_name);
|
||||
} else {
|
||||
printf(" (unknown)");
|
||||
if (vflag && *dev->dd_pnpinfo)
|
||||
|
|
@ -350,11 +247,9 @@ print_rman_resource(struct devinfo_res *res, void *arg __unused)
|
|||
printf(" at %s", dev->dd_location);
|
||||
}
|
||||
} else {
|
||||
asprintf(&entry, "{el:%s}{D:%s} {D:----}\n", res_str, res_str);
|
||||
xo_emit(entry, "----");
|
||||
printf(" ----");
|
||||
}
|
||||
free(entry);
|
||||
last_res = res_str;
|
||||
printf("\n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
|
@ -364,16 +259,8 @@ print_rman_resource(struct devinfo_res *res, void *arg __unused)
|
|||
int
|
||||
print_rman(struct devinfo_rman *rman, void *arg __unused)
|
||||
{
|
||||
char* safe_desc = xml_safe_string(rman->dm_desc);
|
||||
|
||||
xo_emit("<{:description/%s}\n>", rman->dm_desc);
|
||||
xo_open_container(safe_desc);
|
||||
|
||||
printf("%s:\n", rman->dm_desc);
|
||||
devinfo_foreach_rman_resource(rman, print_rman_resource, 0);
|
||||
|
||||
xo_close_list(last_res);
|
||||
xo_close_container(safe_desc);
|
||||
free(safe_desc);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
|
@ -382,17 +269,12 @@ print_device_path_entry(struct devinfo_dev *dev)
|
|||
{
|
||||
const char *devname = dev->dd_name[0] ? dev->dd_name : "unknown";
|
||||
|
||||
xo_open_container(devname);
|
||||
open_tag_count++;
|
||||
xo_emit("{:devicename/%s} ", devname);
|
||||
printf("%s", devname);
|
||||
print_device_props(dev);
|
||||
if (vflag)
|
||||
xo_emit("\n");
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Recurse until we find the right dev. On the way up we print path.
|
||||
*/
|
||||
static int
|
||||
print_device_path(struct devinfo_dev *dev, void *xname)
|
||||
{
|
||||
|
|
@ -406,7 +288,7 @@ print_device_path(struct devinfo_dev *dev, void *xname)
|
|||
|
||||
rv = devinfo_foreach_device_child(dev, print_device_path, xname);
|
||||
if (rv == 1) {
|
||||
xo_emit("{P: }");
|
||||
printf(" ");
|
||||
print_device_path_entry(dev);
|
||||
}
|
||||
return (rv);
|
||||
|
|
@ -415,26 +297,19 @@ print_device_path(struct devinfo_dev *dev, void *xname)
|
|||
static void
|
||||
print_path(struct devinfo_dev *root, char *path)
|
||||
{
|
||||
open_tag_count = 0;
|
||||
if (devinfo_foreach_device_child(root, print_device_path,
|
||||
(void *)path) == 0)
|
||||
xo_errx(1, "%s: Not found", path);
|
||||
if (devinfo_foreach_device_child(root, print_device_path, (void *)path) == 0)
|
||||
errx(1, "%s: Not found", path);
|
||||
if (!vflag)
|
||||
xo_emit("\n");
|
||||
|
||||
while (open_tag_count > 0) {
|
||||
xo_close_container_d();
|
||||
open_tag_count--;
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void __dead2
|
||||
usage(void)
|
||||
{
|
||||
xo_error(
|
||||
"usage: devinfo [-rv]\n",
|
||||
" devinfo -u [-v]\n",
|
||||
" devinfo -p dev [-v]\n");
|
||||
fprintf(stderr, "%s\n%s\n%s\n",
|
||||
"usage: devinfo [-rv]",
|
||||
" devinfo -u [-v]",
|
||||
" devinfo -p dev [-v]");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
@ -446,11 +321,6 @@ main(int argc, char *argv[])
|
|||
bool uflag;
|
||||
char *path = NULL;
|
||||
|
||||
argc = xo_parse_args(argc, argv);
|
||||
if (argc < 0) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
uflag = false;
|
||||
while ((c = getopt(argc, argv, "p:ruv")) != -1) {
|
||||
switch(c) {
|
||||
|
|
@ -476,32 +346,20 @@ main(int argc, char *argv[])
|
|||
|
||||
if ((rv = devinfo_init()) != 0) {
|
||||
errno = rv;
|
||||
xo_err(1, "devinfo_init");
|
||||
err(1, "devinfo_init");
|
||||
}
|
||||
|
||||
if ((root = devinfo_handle_to_device(DEVINFO_ROOT_DEVICE)) == NULL)
|
||||
xo_errx(1, "can't find root device");
|
||||
errx(1, "can't find root device");
|
||||
|
||||
if (path) {
|
||||
xo_set_flags(NULL, XOF_DTRT);
|
||||
xo_open_container("device-path");
|
||||
print_path(root, path);
|
||||
xo_close_container("device-path");
|
||||
} else if (uflag) {
|
||||
/* print resource usage? */
|
||||
xo_set_flags(NULL, XOF_DTRT);
|
||||
xo_open_container("device-resources");
|
||||
devinfo_foreach_rman(print_rman, NULL);
|
||||
xo_close_container("device-resources");
|
||||
} else {
|
||||
/* print device hierarchy */
|
||||
xo_open_container("device-information");
|
||||
devinfo_foreach_device_child(root, print_device, (void *)0);
|
||||
xo_close_container("device-information");
|
||||
}
|
||||
|
||||
if (xo_finish() < 0) {
|
||||
exit(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue