/* * command structure borrowed from udev * (git://git.kernel.org/pub/scm/linux/hotplug/udev.git) * * Copyright (C) 2011 matt mooney * 2005-2007 Takahiro Hirofuchi * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "usbip_common.h" #include "usbip_network.h" #include "usbip.h" static int usbip_help(int argc, char *argv[]); static int usbip_version(int argc, char *argv[]); static const char usbip_version_string[] = PACKAGE_STRING; static const char usbip_usage_string[] = "usbip [--debug] [--log] [--tcp-port PORT] [version]\n" " [help] \n"; static void usbip_usage(void) { printf("usage: %s", usbip_usage_string); } struct command { const char *name; int (*fn)(int argc, char *argv[]); const char *help; void (*usage)(void); }; static const struct command cmds[] = { { .name = "help", .fn = usbip_help, .help = NULL, .usage = NULL }, { .name = "version", .fn = usbip_version, .help = NULL, .usage = NULL }, { .name = "attach", .fn = usbip_attach, .help = "Attach a remote USB device", .usage = usbip_attach_usage }, { .name = "detach", .fn = usbip_detach, .help = "Detach a remote USB device", .usage = usbip_detach_usage }, { .name = "list", .fn = usbip_list, .help = "List exportable or local USB devices", .usage = usbip_list_usage }, { .name = "bind", .fn = usbip_bind, .help = "Bind device to " USBIP_HOST_DRV_NAME ".ko", .usage = usbip_bind_usage }, { .name = "unbind", .fn = usbip_unbind, .help = "Unbind device from " USBIP_HOST_DRV_NAME ".ko", .usage = usbip_unbind_usage }, { .name = "port", .fn = usbip_port_show, .help = "Show imported USB devices", .usage = NULL }, { NULL, NULL, NULL, NULL } }; static int usbip_help(int argc, char *argv[]) { const struct command *cmd; int i; int ret = 0; if (argc > 1 && argv++) { for (i = 0; cmds[i].name != NULL; i++) if (!strcmp(cmds[i].name, argv[0]) && cmds[i].usage) { cmds[i].usage(); goto done; } ret = -1; } usbip_usage(); printf("\n"); for (cmd = cmds; cmd->name != NULL; cmd++) if (cmd->help != NULL) printf(" %-10s %s\n", cmd->name, cmd->help); printf("\n"); done: return ret; } static int usbip_version(int argc, char *argv[]) { (void) argc; (void) argv; printf(PROGNAME " (%s)\n", usbip_version_string); return 0; } static int run_command(const struct command *cmd, int argc, char *argv[]) { dbg("running command: `%s'", cmd->name); return cmd->fn(argc, argv); } int main(int argc, char *argv[]) { static const struct option opts[] = { { "debug", no_argument, NULL, 'd' }, { "log", no_argument, NULL, 'l' }, { "tcp-port", required_argument, NULL, 't' }, { NULL, 0, NULL, 0 } }; char *cmd; int opt; int i, rc = -1; usbip_use_stderr = 1; opterr = 0; for (;;) { opt = getopt_long(argc, argv, "+dlt:", opts, NULL); if (opt == -1) break; switch (opt) { case 'd': usbip_use_debug = 1; break; case 'l': usbip_use_syslog = 1; openlog("", LOG_PID, LOG_USER); break; case 't': usbip_setup_port_number(optarg); break; case '?': printf("usbip: invalid option\n"); default: usbip_usage(); goto out; } } cmd = argv[optind]; if (cmd) { for (i = 0; cmds[i].name != NULL; i++) if (!strcmp(cmds[i].name, cmd)) { argc -= optind; argv += optind; optind = 0; rc = run_command(&cmds[i], argc, argv); goto out; } } /* invalid command */ usbip_help(0, NULL); out: return (rc > -1 ? EXIT_SUCCESS : EXIT_FAILURE); } input type='submit' value='reload'/>
authorLinus Torvalds <torvalds@linux-foundation.org>2017-01-24 16:54:39 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2017-01-24 16:54:39 -0800
commit883af14e67e8b8702b5560aa64c888c0cd0bd66c (patch)
tree74e3a6b53f5fad9f7848ab1b9f6921b7012940a4 /net/ipv6/ping.c
parent0263d4ebd94b36280608e296cba39b924b6e832b (diff)
parentaab45453ff5c77200c6da4ac909f7a4392aed17e (diff)
Merge branch 'akpm' (patches from Andrew)
Merge fixes from Andrew Morton: "26 fixes" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (26 commits) MAINTAINERS: add Dan Streetman to zbud maintainers MAINTAINERS: add Dan Streetman to zswap maintainers mm: do not export ioremap_page_range symbol for external module mn10300: fix build error of missing fpu_save() romfs: use different way to generate fsid for BLOCK or MTD frv: add missing atomic64 operations mm, page_alloc: fix premature OOM when racing with cpuset mems update mm, page_alloc: move cpuset seqcount checking to slowpath mm, page_alloc: fix fast-path race with cpuset update or removal mm, page_alloc: fix check for NULL preferred_zone kernel/panic.c: add missing \n fbdev: color map copying bounds checking frv: add atomic64_add_unless() mm/mempolicy.c: do not put mempolicy before using its nodemask radix-tree: fix private list warnings Documentation/filesystems/proc.txt: add VmPin mm, memcg: do not retry precharge charges proc: add a schedule point in proc_pid_readdir() mm: alloc_contig: re-allow CMA to compact FS pages mm/slub.c: trace free objects at KERN_INFO ...
Diffstat (limited to 'net/ipv6/ping.c')