My recent work to force USB devices to attach as ugen(4) [0] and Ilya's work to enable/disable USB devices [1] have a lot in common. Now I'd argue that we don't want new userland tool for these functionalities. IMHO we should improve usbdevs(8).
Sadly usbdevs(8) output is hard to read. So here's a first diff to improve that. With the diff below '-v' can be specified multiple time and the 'port' status of hub are only printed if verbose is > 1. That's similar to pcidump(8)'s -xxx :) Like in pcidump(8) the USB "Controller" or bus, will now be displayed unconditionally. This matters now that most computer have multiple controllers and it is coherent with pcidump(8). This is just a first step :) Ok? [0] https://marc.info/?l=openbsd-tech&m=152457124405318&w=2 [1] https://marc.info/?l=openbsd-tech&m=152996290828464&w=2 Index: usbdevs.c =================================================================== RCS file: /cvs/src/usr.sbin/usbdevs/usbdevs.c,v retrieving revision 1.25 diff -u -p -r1.25 usbdevs.c --- usbdevs.c 22 Dec 2015 08:36:40 -0000 1.25 +++ usbdevs.c 28 Jun 2018 11:21:33 -0000 @@ -30,15 +30,17 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <sys/types.h> +#include <dev/usb/usb.h> + +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <sys/types.h> -#include <fcntl.h> #include <unistd.h> -#include <err.h> -#include <errno.h> -#include <dev/usb/usb.h> #ifndef nitems #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) @@ -131,7 +133,7 @@ usbdev(int f, int a, int rec) int s = di.udi_ports[p]; if (s >= USB_MAX_DEVICES) { - if (verbose) { + if (verbose > 1) { printf("%*sport %d %s\n", indent+1, "", p+1, s == USB_PORT_ENABLED ? "enabled" : s == USB_PORT_SUSPENDED ? "suspended" : @@ -143,7 +145,7 @@ usbdev(int f, int a, int rec) } indent++; printf("%*s", indent, ""); - if (verbose) + if (verbose > 1) printf("port %d ", p+1); if (s == 0) printf("addr 0 should never happen!\n"); @@ -167,7 +169,7 @@ usbdump(int f) void dumpone(char *name, int f, int addr) { - if (verbose) + if (!addr) printf("Controller %s:\n", name); indent = 0; memset(done, 0, sizeof done); @@ -201,7 +203,7 @@ main(int argc, char **argv) dev = optarg; break; case 'v': - verbose = 1; + verbose++; break; default: usage(); @@ -210,6 +212,9 @@ main(int argc, char **argv) argc -= optind; argv += optind; + if (argc != 0) + usage(); + if (dev == 0) { for (ncont = 0, i = 0; i < 10; i++) { snprintf(buf, sizeof buf, "%s%d", USBDEV, i); @@ -229,10 +234,12 @@ main(int argc, char **argv) __progname); } else { f = open(dev, O_RDONLY); - if (f >= 0) + if (f >= 0) { dumpone(dev, f, addr); - else + close(f); + } else err(1, "%s", dev); } - exit(0); + + return 0; }
