| /* vi: set sw=4 ts=4: */ |
| /* |
| * lspci implementation for busybox |
| * |
| * Copyright (C) 2009 Malek Degachi <malek-degachi@laposte.net> |
| * |
| * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. |
| */ |
| #include <libbb.h> |
| |
| static int FAST_FUNC fileAction( |
| const char *fileName, |
| struct stat *statbuf UNUSED_PARAM, |
| void *userData UNUSED_PARAM, |
| int depth UNUSED_PARAM) |
| { |
| parser_t *parser; |
| char *tokens[6]; |
| char *bus = NULL, *device = NULL; |
| int product_vid = 0, product_did = 0; |
| |
| char *uevent_filename = concat_path_file(fileName, "/uevent"); |
| parser = config_open2(uevent_filename, fopen_for_read); |
| free(uevent_filename); |
| |
| while (config_read(parser, tokens, 6, 1, "\\/=", PARSE_NORMAL)) { |
| if ((parser->lineno == 1) && strcmp(tokens[0], "DEVTYPE") == 0) { |
| break; |
| } |
| |
| if (strcmp(tokens[0], "DEVICE") == 0) { |
| bus = xstrdup(tokens[4]); |
| device = xstrdup(tokens[5]); |
| continue; |
| } |
| |
| if (strcmp(tokens[0], "PRODUCT") == 0) { |
| product_vid = xstrtou(tokens[1], 16); |
| product_did = xstrtou(tokens[2], 16); |
| continue; |
| } |
| } |
| config_close(parser); |
| |
| if (bus) { |
| printf("Bus %s Device %s: ID %04x:%04x\n", bus, device, product_vid, product_did); |
| free(bus); |
| free(device); |
| } |
| |
| return TRUE; |
| } |
| |
| int lsusb_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| int lsusb_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM) |
| { |
| /* no options, no getopt */ |
| |
| recursive_action("/sys/bus/usb/devices", |
| ACTION_RECURSE, |
| fileAction, |
| NULL, /* dirAction */ |
| NULL, /* userData */ |
| 0 /* depth */); |
| |
| return EXIT_SUCCESS; |
| } |