The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=43b07bdbc5d24febc7a904d16f05f921c478eaa7
commit 43b07bdbc5d24febc7a904d16f05f921c478eaa7 Author: John Baldwin <[email protected]> AuthorDate: 2025-12-15 15:36:00 +0000 Commit: John Baldwin <[email protected]> CommitDate: 2025-12-15 15:36:00 +0000 Revert "devinfo: Add support for libxo" This broke the human output formatting in several ways. This reverts commit 4cf5878d27ddc9d3ca3ed870f88112c3b4f6fb69. This reverts commit e8d6b58ef5a4afe0d155b6967c92d55f3bbd53fe. This reverts commit c759aca606cee8352c1d739bf7a762c8a2ed2012. PR: 291511 Reviewed by: imp, des Differential Revision: https://reviews.freebsd.org/D54196 --- usr.sbin/devinfo/Makefile | 2 +- usr.sbin/devinfo/devinfo.8 | 14 +-- usr.sbin/devinfo/devinfo.c | 216 ++++++++------------------------------------- 3 files changed, 39 insertions(+), 193 deletions(-) diff --git a/usr.sbin/devinfo/Makefile b/usr.sbin/devinfo/Makefile index 55b234f18363..f6506c176c9c 100644 --- a/usr.sbin/devinfo/Makefile +++ b/usr.sbin/devinfo/Makefile @@ -2,6 +2,6 @@ PACKAGE= devmatch PROG= devinfo MAN= devinfo.8 -LIBADD= xo devinfo +LIBADD= devinfo .include <bsd.prog.mk> diff --git a/usr.sbin/devinfo/devinfo.8 b/usr.sbin/devinfo/devinfo.8 index c34713d367ff..15a6059c166f 100644 --- a/usr.sbin/devinfo/devinfo.8 +++ b/usr.sbin/devinfo/devinfo.8 @@ -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 , diff --git a/usr.sbin/devinfo/devinfo.c b/usr.sbin/devinfo/devinfo.c index 4163151ec840..43d88481d903 100644 --- a/usr.sbin/devinfo/devinfo.c +++ b/usr.sbin/devinfo/devinfo.c @@ -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); }
