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(&copy, " ")) != 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);
 }

Reply via email to