compositor: fix the over operator
[helenos.git] / uspace / app / usbinfo / main.c
blob67dcb5789b9d07b547f39c01f86650766fe9299e
1 /*
2 * Copyright (c) 2010-2011 Vojtech Horky
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup usbinfo
30 * @{
32 /**
33 * @file
34 * USB querying.
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <errno.h>
40 #include <str_error.h>
41 #include <stdbool.h>
42 #include <getopt.h>
43 #include <devman.h>
44 #include <loc.h>
45 #include <usb/dev.h>
46 #include <usb/dev/pipes.h>
47 #include "usbinfo.h"
49 static void print_usage(char *app_name)
51 #define _INDENT " "
52 #define _OPTION(opt, description) \
53 printf(_INDENT opt "\n" _INDENT _INDENT description "\n")
55 printf(NAME ": query USB devices for descriptors\n\n");
56 printf("Usage: %s [options] device [device [device [ ... ]]]\n",
57 app_name);
58 printf(_INDENT "The device can be specified in two ways.\n");
59 printf(_INDENT " o Using its devman path, e.g. /hw/pci0/.../usb00_a1.\n");
60 printf(_INDENT " o Or using BUS.ADDR numbers as printed by lsusb.\n");
62 _OPTION("-h --help", "Print this help and exit.");
63 _OPTION("-l --list", "Print a list of host controllers and devices.");
64 _OPTION("-i --identification", "Brief device identification.");
65 _OPTION("-m --match-ids", "Print match ids generated for the device.");
66 _OPTION("-t --descriptor-tree", "Print descriptor tree.");
67 _OPTION("-T --descriptor-tree-full", "Print detailed descriptor tree");
68 _OPTION("-s --strings", "Try to print all string descriptors.");
69 _OPTION("-S --status", "Get status of the device.");
70 _OPTION("-r --hid-report", "Dump HID report descriptor.");
71 _OPTION("-r --hid-report-usages", "Dump usages of HID report.");
73 printf("\n");
74 printf("If no option is specified, `-i' is considered default.\n");
75 printf("\n");
77 #undef _OPTION
78 #undef _INDENT
81 static struct option long_options[] = {
82 { "help", no_argument, NULL, 'h' },
83 { "identification", no_argument, NULL, 'i' },
84 { "list", no_argument, NULL, 'l' },
85 { "match-ids", no_argument, NULL, 'm' },
86 { "descriptor-tree", no_argument, NULL, 't' },
87 { "descriptor-tree-full", no_argument, NULL, 'T' },
88 { "strings", no_argument, NULL, 's' },
89 { "status", no_argument, NULL, 'S' },
90 { "hid-report", no_argument, NULL, 'r' },
91 { "hid-report-usages", no_argument, NULL, 'R' },
92 { 0, 0, NULL, 0 }
94 static const char *short_options = "hilmtTsSrR";
96 static usbinfo_action_t actions[] = {
98 .opt = 'i',
99 .action = dump_short_device_identification,
100 .active = false
103 .opt = 'm',
104 .action = dump_device_match_ids,
105 .active = false
108 .opt = 't',
109 .action = dump_descriptor_tree_brief,
110 .active = false
113 .opt = 'T',
114 .action = dump_descriptor_tree_full,
115 .active = false
118 .opt = 's',
119 .action = dump_strings,
120 .active = false
123 .opt = 'S',
124 .action = dump_status,
125 .active = false
128 .opt = 'r',
129 .action = dump_hidreport_raw,
130 .active = false
133 .opt = 'R',
134 .action = dump_hidreport_usages,
135 .active = false
138 .opt = 0
142 int main(int argc, char *argv[])
144 if (argc <= 1) {
145 print_usage(argv[0]);
146 return -1;
149 bool something_active = false;
151 * Process command-line options. They determine what shall be
152 * done with the device.
154 int opt;
155 int idx;
156 do {
157 opt = getopt_long(argc, argv,
158 short_options, long_options, NULL);
159 switch (opt) {
160 case -1:
161 break;
162 case 'l':
163 list();
164 break;
165 case '?':
166 print_usage(argv[0]);
167 return 1;
168 case 'h':
169 print_usage(argv[0]);
170 return 0;
171 default:
172 idx = 0;
173 while (actions[idx].opt != 0) {
174 if (actions[idx].opt == opt) {
175 actions[idx].active = true;
176 something_active = true;
177 break;
179 idx++;
181 break;
183 } while (opt > 0);
185 /* Set the default action. */
186 if (!something_active) {
187 actions[0].active = true;
191 * Go through all devices given on the command line and run the
192 * specified actions.
194 int i;
195 for (i = optind; i < argc; i++) {
196 char *devpath = argv[i];
198 /* The initialization is here only to make compiler happy. */
199 devman_handle_t handle = 0;
200 errno_t rc = usb_resolve_device_handle(devpath, &handle);
201 if (rc != EOK) {
202 fprintf(stderr, NAME ": device `%s' not found "
203 "or not of USB kind, skipping.\n",
204 devpath);
205 continue;
208 usb_device_t *usb_dev = usb_device_create(handle);
210 if (usb_dev == NULL) {
211 fprintf(stderr, NAME ": device `%s' not found "
212 "or not of USB kind, skipping.\n",
213 devpath);
214 continue;
217 /* Run actions the user specified. */
218 printf("%s\n", devpath);
220 int action = 0;
221 while (actions[action].opt != 0) {
222 if (actions[action].active) {
223 actions[action].action(usb_dev);
225 action++;
228 usb_device_destroy(usb_dev);
231 return 0;
234 /** @}