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