diff toys/other/lsusb.c @ 900:edd8e6fd418d

Attached is a pretty simple implementation of lsub. It doesn't implement any of the flags/options, but does the raw output.
author Andre Renaud <andre@bluewatersys.com>
date Tue, 14 May 2013 17:42:11 -0500
parents
children 36993c59a3d3
line wrap: on
line diff
--- /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 <andre@bluewatersys.com>
+
+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;
+}