busybox/util-linux/lsusb.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * lsusb implementation for busybox
   4 *
   5 * Copyright (C) 2009  Malek Degachi <malek-degachi@laposte.net>
   6 *
   7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
   8 */
   9//config:config LSUSB
  10//config:       bool "lsusb (4.2 kb)"
  11//config:       default y
  12//config:       help
  13//config:       lsusb is a utility for displaying information about USB buses in the
  14//config:       system and devices connected to them.
  15//config:
  16//config:       This version uses sysfs (/sys/bus/usb/devices) only.
  17
  18//applet:IF_LSUSB(APPLET_NOEXEC(lsusb, lsusb, BB_DIR_USR_BIN, BB_SUID_DROP, lsusb))
  19
  20//kbuild:lib-$(CONFIG_LSUSB) += lsusb.o
  21
  22//usage:#define lsusb_trivial_usage NOUSAGE_STR
  23//usage:#define lsusb_full_usage ""
  24
  25#include "libbb.h"
  26
  27static int FAST_FUNC fileAction(struct recursive_state *state UNUSED_PARAM,
  28                const char *fileName,
  29                struct stat *statbuf UNUSED_PARAM)
  30{
  31        parser_t *parser;
  32        char *tokens[4];
  33        char *busnum = NULL, *devnum = NULL;
  34        int product_vid = 0, product_did = 0;
  35        char *uevent_filename = concat_path_file(fileName, "/uevent");
  36
  37        parser = config_open2(uevent_filename, fopen_for_read);
  38        free(uevent_filename);
  39
  40        while (config_read(parser, tokens, 4, 2, "\\/=", PARSE_NORMAL)) {
  41                if ((parser->lineno == 1) && strcmp(tokens[0], "DEVTYPE") == 0) {
  42                        break;
  43                }
  44
  45                if (strcmp(tokens[0], "PRODUCT") == 0) {
  46                        product_vid = xstrtou(tokens[1], 16);
  47                        product_did = xstrtou(tokens[2], 16);
  48                        continue;
  49                }
  50
  51                if (strcmp(tokens[0], "BUSNUM") == 0) {
  52                        busnum = xstrdup(tokens[1]);
  53                        continue;
  54                }
  55
  56                if (strcmp(tokens[0], "DEVNUM") == 0) {
  57                        devnum = xstrdup(tokens[1]);
  58                        continue;
  59                }
  60        }
  61        config_close(parser);
  62
  63        if (busnum) {
  64                printf("Bus %s Device %s: ID %04x:%04x\n", busnum, devnum, product_vid, product_did);
  65                free(busnum);
  66                free(devnum);
  67        }
  68
  69        return TRUE;
  70}
  71
  72int lsusb_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  73int lsusb_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
  74{
  75        /* no options, no getopt */
  76
  77        recursive_action("/sys/bus/usb/devices",
  78                        ACTION_RECURSE,
  79                        fileAction,
  80                        NULL, /* dirAction */
  81                        NULL /* userData */
  82        );
  83
  84        return EXIT_SUCCESS;
  85}
  86