1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * command structure borrowed from udev
4 * (git://git.kernel.org/pub/scm/linux/hotplug/udev.git)
6 * Copyright (C) 2011 matt mooney <mfm@muteddisk.com>
7 * 2005-2007 Takahiro Hirofuchi
16 #include "usbip_common.h"
17 #include "usbip_network.h"
20 static int usbip_help(int argc, char *argv[]);
21 static int usbip_version(int argc, char *argv[]);
23 static const char usbip_version_string[] = PACKAGE_STRING;
25 static const char usbip_usage_string[] =
26 "usbip [--debug] [--log] [--tcp-port PORT] [version]\n"
27 " [help] <command> <args>\n";
29 static void usbip_usage(void)
31 printf("usage: %s", usbip_usage_string);
36 int (*fn)(int argc, char *argv[]);
41 static const struct command cmds[] = {
57 .help = "Attach a remote USB device",
58 .usage = usbip_attach_usage
63 .help = "Detach a remote USB device",
64 .usage = usbip_detach_usage
69 .help = "List exportable or local USB devices",
70 .usage = usbip_list_usage
75 .help = "Bind device to " USBIP_HOST_DRV_NAME ".ko",
76 .usage = usbip_bind_usage
81 .help = "Unbind device from " USBIP_HOST_DRV_NAME ".ko",
82 .usage = usbip_unbind_usage
86 .fn = usbip_port_show,
87 .help = "Show imported USB devices",
90 { NULL, NULL, NULL, NULL }
93 static int usbip_help(int argc, char *argv[])
95 const struct command *cmd;
99 if (argc > 1 && argv++) {
100 for (i = 0; cmds[i].name != NULL; i++)
101 if (!strcmp(cmds[i].name, argv[0]) && cmds[i].usage) {
110 for (cmd = cmds; cmd->name != NULL; cmd++)
111 if (cmd->help != NULL)
112 printf(" %-10s %s\n", cmd->name, cmd->help);
118 static int usbip_version(int argc, char *argv[])
123 printf(PROGNAME " (%s)\n", usbip_version_string);
127 static int run_command(const struct command *cmd, int argc, char *argv[])
129 dbg("running command: `%s'", cmd->name);
130 return cmd->fn(argc, argv);
133 int main(int argc, char *argv[])
135 static const struct option opts[] = {
136 { "debug", no_argument, NULL, 'd' },
137 { "log", no_argument, NULL, 'l' },
138 { "tcp-port", required_argument, NULL, 't' },
146 usbip_use_stderr = 1;
149 opt = getopt_long(argc, argv, "+dlt:", opts, NULL);
159 usbip_use_syslog = 1;
160 openlog("", LOG_PID, LOG_USER);
163 usbip_setup_port_number(optarg);
166 printf("usbip: invalid option\n");
167 /* Terminate after printing error */
177 for (i = 0; cmds[i].name != NULL; i++)
178 if (!strcmp(cmds[i].name, cmd)) {
182 rc = run_command(&cmds[i], argc, argv);
187 /* invalid command */
190 return (rc > -1 ? EXIT_SUCCESS : EXIT_FAILURE);