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
);