2 * kmod - one tool to rule them all
4 * Copyright (C) 2011-2013 ProFUSION embedded systems
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include <shared/util.h>
28 #include <libkmod/libkmod.h>
32 static const char options_s[] = "+hV";
33 static const struct option options[] = {
34 { "help", no_argument, NULL, 'h' },
35 { "version", no_argument, NULL, 'V' },
39 static const struct kmod_cmd kmod_cmd_help;
41 static const struct kmod_cmd *kmod_cmds[] = {
44 &kmod_cmd_static_nodes,
46 #ifdef ENABLE_EXPERIMENTAL
52 static const struct kmod_cmd *kmod_compat_cmds[] = {
53 &kmod_cmd_compat_lsmod,
54 &kmod_cmd_compat_rmmod,
55 &kmod_cmd_compat_insmod,
56 &kmod_cmd_compat_modinfo,
57 &kmod_cmd_compat_modprobe,
58 &kmod_cmd_compat_depmod,
61 static int kmod_help(int argc, char *argv[])
65 printf("kmod - Manage kernel modules: list, load, unload, etc\n"
67 "\t%s [options] command [command_options]\n\n"
69 "\t-V, --version show version\n"
70 "\t-h, --help show this help\n\n"
71 "Commands:\n", basename(argv[0]));
73 for (i = 0; i < ARRAY_SIZE(kmod_cmds); i++) {
74 if (kmod_cmds[i]->help != NULL) {
75 printf(" %-12s %s\n", kmod_cmds[i]->name,
80 puts("\nkmod also handles gracefully if called from following symlinks:");
82 for (i = 0; i < ARRAY_SIZE(kmod_compat_cmds); i++) {
83 if (kmod_compat_cmds[i]->help != NULL) {
84 printf(" %-12s %s\n", kmod_compat_cmds[i]->name,
85 kmod_compat_cmds[i]->help);
92 static const struct kmod_cmd kmod_cmd_help = {
95 .help = "Show help message",
98 static int handle_kmod_commands(int argc, char *argv[])
107 c = getopt_long(argc, argv, options_s, options, NULL);
113 kmod_help(argc, argv);
116 puts(PACKAGE " version " VERSION);
122 fprintf(stderr, "Error: unexpected getopt_long() value '%c'.\n", c);
127 if (optind >= argc) {
128 fputs("missing command\n", stderr);
134 for (i = 0, err = -EINVAL; i < ARRAY_SIZE(kmod_cmds); i++) {
135 if (streq(kmod_cmds[i]->name, cmd)) {
136 err = kmod_cmds[i]->cmd(--argc, ++argv);
142 fprintf(stderr, "invalid command '%s'\n", cmd);
149 kmod_help(argc, argv);
154 static int handle_kmod_compat_commands(int argc, char *argv[])
159 cmd = basename(argv[0]);
161 for (i = 0; i < ARRAY_SIZE(kmod_compat_cmds); i++) {
162 if (streq(kmod_compat_cmds[i]->name, cmd))
163 return kmod_compat_cmds[i]->cmd(argc, argv);
169 int main(int argc, char *argv[])
173 if (streq(program_invocation_short_name, "kmod"))
174 err = handle_kmod_commands(argc, argv);
176 err = handle_kmod_compat_commands(argc, argv);