1/* See LICENSE file for copyright and license details. */
2
3#include <limits.h>
4#include <stdio.h>
5#include <stdlib.h>
6
7#include "paths.h"
8#include "text.h"
9#include "util.h"
10
11static void
12lsusb(const char *file)
13{
14 FILE *fp;
15 char path[PATH_MAX];
16 char *buf = NULL;
17 size_t size = 0;
18 unsigned int i = 0, busnum = 0, devnum = 0, pid = 0, vid = 0;
19
20 if (strlcpy(path, file, sizeof(path)) >= sizeof(path))
21 eprintf("path too long\n");
22 if (strlcat(path, "/uevent", sizeof(path)) >= sizeof(path))
23 eprintf("path too long\n");
24
25 if (!(fp = fopen(path, "r")))
26 return;
27 while (agetline(&buf, &size, fp) != -1) {
28 if (sscanf(buf, "BUSNUM=%u\n", &busnum) || sscanf(buf, "DEVNUM=%u\n", &devnum)
29 || sscanf(buf, "PRODUCT=%x/%x/", &pid, &vid))
30 i++;
31 if (i == 3) {
32 printf("Bus %03d Device %03d: ID %04x:%04x\n", busnum, devnum, pid, vid);
33 break;
34 }
35 }
36 if (ferror(fp))
37 eprintf("%s: read error:", path);
38 free(buf);
39 fclose(fp);
40}
41
42static void
43usage(void)
44{
45 eprintf("usage: %s\n", argv0);
46}
47
48// ?man lsusb: list usb devices
49// ?man display information about usb buses and connected devices
50int
51main(int argc, char *argv[])
52{
53 ARGBEGIN
54 {
55 default:
56 usage();
57 }
58 ARGEND;
59
60 recurse_dir(ARUU_LINUX_PATH_SYS_BUS_USB, lsusb);
61 return 0;
62}