Linux Audio

Check our new training course

Loading...
  1/*
  2 * command structure borrowed from udev
  3 * (git://git.kernel.org/pub/scm/linux/hotplug/udev.git)
  4 *
  5 * Copyright (C) 2011 matt mooney <mfm@muteddisk.com>
  6 *               2005-2007 Takahiro Hirofuchi
  7 *
  8 * This program is free software: you can redistribute it and/or modify
  9 * it under the terms of the GNU General Public License as published by
 10 * the Free Software Foundation, either version 2 of the License, or
 11 * (at your option) any later version.
 12 *
 13 * This program is distributed in the hope that it will be useful,
 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 16 * GNU General Public License for more details.
 17 *
 18 * You should have received a copy of the GNU General Public License
 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 20 */
 21
 22#include <stdio.h>
 23#include <stdlib.h>
 24
 25#include <getopt.h>
 26#include <syslog.h>
 27
 28#include "usbip_common.h"
 29#include "usbip_network.h"
 30#include "usbip.h"
 31
 32static int usbip_help(int argc, char *argv[]);
 33static int usbip_version(int argc, char *argv[]);
 34
 35static const char usbip_version_string[] = PACKAGE_STRING;
 36
 37static const char usbip_usage_string[] =
 38	"usbip [--debug] [--log] [--tcp-port PORT] [version]\n"
 39	"             [help] <command> <args>\n";
 40
 41static void usbip_usage(void)
 42{
 43	printf("usage: %s", usbip_usage_string);
 44}
 45
 46struct command {
 47	const char *name;
 48	int (*fn)(int argc, char *argv[]);
 49	const char *help;
 50	void (*usage)(void);
 51};
 52
 53static const struct command cmds[] = {
 54	{
 55		.name  = "help",
 56		.fn    = usbip_help,
 57		.help  = NULL,
 58		.usage = NULL
 59	},
 60	{
 61		.name  = "version",
 62		.fn    = usbip_version,
 63		.help  = NULL,
 64		.usage = NULL
 65	},
 66	{
 67		.name  = "attach",
 68		.fn    = usbip_attach,
 69		.help  = "Attach a remote USB device",
 70		.usage = usbip_attach_usage
 71	},
 72	{
 73		.name  = "detach",
 74		.fn    = usbip_detach,
 75		.help  = "Detach a remote USB device",
 76		.usage = usbip_detach_usage
 77	},
 78	{
 79		.name  = "list",
 80		.fn    = usbip_list,
 81		.help  = "List exportable or local USB devices",
 82		.usage = usbip_list_usage
 83	},
 84	{
 85		.name  = "bind",
 86		.fn    = usbip_bind,
 87		.help  = "Bind device to " USBIP_HOST_DRV_NAME ".ko",
 88		.usage = usbip_bind_usage
 89	},
 90	{
 91		.name  = "unbind",
 92		.fn    = usbip_unbind,
 93		.help  = "Unbind device from " USBIP_HOST_DRV_NAME ".ko",
 94		.usage = usbip_unbind_usage
 95	},
 96	{
 97		.name  = "port",
 98		.fn    = usbip_port_show,
 99		.help  = "Show imported USB devices",
100		.usage = NULL
101	},
102	{ NULL, NULL, NULL, NULL }
103};
104
105static int usbip_help(int argc, char *argv[])
106{
107	const struct command *cmd;
108	int i;
109	int ret = 0;
110
111	if (argc > 1 && argv++) {
112		for (i = 0; cmds[i].name != NULL; i++)
113			if (!strcmp(cmds[i].name, argv[0]) && cmds[i].usage) {
114				cmds[i].usage();
115				goto done;
116			}
117		ret = -1;
118	}
119
120	usbip_usage();
121	printf("\n");
122	for (cmd = cmds; cmd->name != NULL; cmd++)
123		if (cmd->help != NULL)
124			printf("  %-10s %s\n", cmd->name, cmd->help);
125	printf("\n");
126done:
127	return ret;
128}
129
130static int usbip_version(int argc, char *argv[])
131{
132	(void) argc;
133	(void) argv;
134
135	printf(PROGNAME " (%s)\n", usbip_version_string);
136	return 0;
137}
138
139static int run_command(const struct command *cmd, int argc, char *argv[])
140{
141	dbg("running command: `%s'", cmd->name);
142	return cmd->fn(argc, argv);
143}
144
145int main(int argc, char *argv[])
146{
147	static const struct option opts[] = {
148		{ "debug",    no_argument,       NULL, 'd' },
149		{ "log",      no_argument,       NULL, 'l' },
150		{ "tcp-port", required_argument, NULL, 't' },
151		{ NULL,       0,                 NULL,  0  }
152	};
153
154	char *cmd;
155	int opt;
156	int i, rc = -1;
157
158	usbip_use_stderr = 1;
159	opterr = 0;
160	for (;;) {
161		opt = getopt_long(argc, argv, "+dlt:", opts, NULL);
162
163		if (opt == -1)
164			break;
165
166		switch (opt) {
167		case 'd':
168			usbip_use_debug = 1;
169			break;
170		case 'l':
171			usbip_use_syslog = 1;
172			openlog("", LOG_PID, LOG_USER);
173			break;
174		case 't':
175			usbip_setup_port_number(optarg);
176			break;
177		case '?':
178			printf("usbip: invalid option\n");
179		default:
180			usbip_usage();
181			goto out;
182		}
183	}
184
185	cmd = argv[optind];
186	if (cmd) {
187		for (i = 0; cmds[i].name != NULL; i++)
188			if (!strcmp(cmds[i].name, cmd)) {
189				argc -= optind;
190				argv += optind;
191				optind = 0;
192				rc = run_command(&cmds[i], argc, argv);
193				goto out;
194			}
195	}
196
197	/* invalid command */
198	usbip_help(0, NULL);
199out:
200	return (rc > -1 ? EXIT_SUCCESS : EXIT_FAILURE);
201}
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 * command structure borrowed from udev
  4 * (git://git.kernel.org/pub/scm/linux/hotplug/udev.git)
  5 *
  6 * Copyright (C) 2011 matt mooney <mfm@muteddisk.com>
  7 *               2005-2007 Takahiro Hirofuchi
  8 */
  9
 10#include <stdio.h>
 11#include <stdlib.h>
 12
 13#include <getopt.h>
 14#include <syslog.h>
 15
 16#include "usbip_common.h"
 17#include "usbip_network.h"
 18#include "usbip.h"
 19
 20static int usbip_help(int argc, char *argv[]);
 21static int usbip_version(int argc, char *argv[]);
 22
 23static const char usbip_version_string[] = PACKAGE_STRING;
 24
 25static const char usbip_usage_string[] =
 26	"usbip [--debug] [--log] [--tcp-port PORT] [version]\n"
 27	"             [help] <command> <args>\n";
 28
 29static void usbip_usage(void)
 30{
 31	printf("usage: %s", usbip_usage_string);
 32}
 33
 34struct command {
 35	const char *name;
 36	int (*fn)(int argc, char *argv[]);
 37	const char *help;
 38	void (*usage)(void);
 39};
 40
 41static const struct command cmds[] = {
 42	{
 43		.name  = "help",
 44		.fn    = usbip_help,
 45		.help  = NULL,
 46		.usage = NULL
 47	},
 48	{
 49		.name  = "version",
 50		.fn    = usbip_version,
 51		.help  = NULL,
 52		.usage = NULL
 53	},
 54	{
 55		.name  = "attach",
 56		.fn    = usbip_attach,
 57		.help  = "Attach a remote USB device",
 58		.usage = usbip_attach_usage
 59	},
 60	{
 61		.name  = "detach",
 62		.fn    = usbip_detach,
 63		.help  = "Detach a remote USB device",
 64		.usage = usbip_detach_usage
 65	},
 66	{
 67		.name  = "list",
 68		.fn    = usbip_list,
 69		.help  = "List exportable or local USB devices",
 70		.usage = usbip_list_usage
 71	},
 72	{
 73		.name  = "bind",
 74		.fn    = usbip_bind,
 75		.help  = "Bind device to " USBIP_HOST_DRV_NAME ".ko",
 76		.usage = usbip_bind_usage
 77	},
 78	{
 79		.name  = "unbind",
 80		.fn    = usbip_unbind,
 81		.help  = "Unbind device from " USBIP_HOST_DRV_NAME ".ko",
 82		.usage = usbip_unbind_usage
 83	},
 84	{
 85		.name  = "port",
 86		.fn    = usbip_port_show,
 87		.help  = "Show imported USB devices",
 88		.usage = NULL
 89	},
 90	{ NULL, NULL, NULL, NULL }
 91};
 92
 93static int usbip_help(int argc, char *argv[])
 94{
 95	const struct command *cmd;
 96	int i;
 97	int ret = 0;
 98
 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) {
102				cmds[i].usage();
103				goto done;
104			}
105		ret = -1;
106	}
107
108	usbip_usage();
109	printf("\n");
110	for (cmd = cmds; cmd->name != NULL; cmd++)
111		if (cmd->help != NULL)
112			printf("  %-10s %s\n", cmd->name, cmd->help);
113	printf("\n");
114done:
115	return ret;
116}
117
118static int usbip_version(int argc, char *argv[])
119{
120	(void) argc;
121	(void) argv;
122
123	printf(PROGNAME " (%s)\n", usbip_version_string);
124	return 0;
125}
126
127static int run_command(const struct command *cmd, int argc, char *argv[])
128{
129	dbg("running command: `%s'", cmd->name);
130	return cmd->fn(argc, argv);
131}
132
133int main(int argc, char *argv[])
134{
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' },
139		{ NULL,       0,                 NULL,  0  }
140	};
141
142	char *cmd;
143	int opt;
144	int i, rc = -1;
145
146	usbip_use_stderr = 1;
147	opterr = 0;
148	for (;;) {
149		opt = getopt_long(argc, argv, "+dlt:", opts, NULL);
150
151		if (opt == -1)
152			break;
153
154		switch (opt) {
155		case 'd':
156			usbip_use_debug = 1;
157			break;
158		case 'l':
159			usbip_use_syslog = 1;
160			openlog("", LOG_PID, LOG_USER);
161			break;
162		case 't':
163			usbip_setup_port_number(optarg);
164			break;
165		case '?':
166			printf("usbip: invalid option\n");
167			/* Terminate after printing error */
168			/* FALLTHRU */
169		default:
170			usbip_usage();
171			goto out;
172		}
173	}
174
175	cmd = argv[optind];
176	if (cmd) {
177		for (i = 0; cmds[i].name != NULL; i++)
178			if (!strcmp(cmds[i].name, cmd)) {
179				argc -= optind;
180				argv += optind;
181				optind = 0;
182				rc = run_command(&cmds[i], argc, argv);
183				goto out;
184			}
185	}
186
187	/* invalid command */
188	usbip_help(0, NULL);
189out:
190	return (rc > -1 ? EXIT_SUCCESS : EXIT_FAILURE);
191}