# HG changeset patch # User Andre Renaud # Date 1368571331 18000 # Node ID edd8e6fd418d1960fd7e636d401454256e841e78 # Parent 7b2e8f9db29bebbf9f5a01837c45fce4b5acad8f Attached is a pretty simple implementation of lsub. It doesn't implement any of the flags/options, but does the raw output. diff -r 7b2e8f9db29b -r edd8e6fd418d toys/other/lsusb.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toys/other/lsusb.c Tue May 14 17:42:11 2013 -0500 @@ -0,0 +1,60 @@ +/* lsusb.c - list available USB devices + * + * Copyright 2013 Andre Renaud + +USE_LSUSB(NEWTOY(lsusb, NULL, TOYFLAG_USR|TOYFLAG_BIN)) + +config LSUSB + bool "lsusb" + default n + help + usage: lsusb +*/ + +#include "toys.h" + +static int list_device(struct dirtree *new) +{ + FILE *file; + char *name; + int busnum = 0; + int devnum = 0; + int pid = 0; + int vid = 0; + if (!new->parent) + return DIRTREE_RECURSE; + if (new->name[0] == '.') + return 0; + name = dirtree_path(new, 0); + snprintf(toybuf, sizeof(toybuf), "%s/%s", name, "/uevent"); + file = fopen(toybuf, "r"); + if (!file) + return 0; + if (!fgets(toybuf, sizeof(toybuf), file) || !strncmp(toybuf, "DEVTYPE=", 8)) { + fclose(file); + return 0; + } + while (fgets(toybuf, sizeof(toybuf), file)) { + if (!strncmp(toybuf, "BUSNUM=", 7)) + busnum = atoi(&toybuf[7]); + if (!strncmp(toybuf, "DEVNUM=", 7)) + devnum = atoi(&toybuf[7]); + if (!strncmp(toybuf, "PRODUCT=", 8)) { + char *pos = strchr(toybuf, '/'); + pid = xstrtoul(&toybuf[8], NULL, 16); + if (pos) + vid = xstrtoul(pos + 1, NULL, 16); + } + } + fclose(file); + + printf("Bus %03d Device %03d: ID %04x:%04x\n", busnum, devnum, pid, vid); + + return 0; +} + +void lsusb_main(void) +{ + dirtree_read("/sys/bus/usb/devices/", list_device); + return; +}