Start 1.33.0 development cycle
[oweals/busybox.git] / modutils / insmod.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Mini insmod implementation for busybox
4  *
5  * Copyright (C) 2008 Timo Teras <timo.teras@iki.fi>
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8  */
9 //config:config INSMOD
10 //config:       bool "insmod (22 kb)"
11 //config:       default y
12 //config:       select PLATFORM_LINUX
13 //config:       help
14 //config:       insmod is used to load specified modules in the running kernel.
15
16 //applet:IF_INSMOD(IF_NOT_MODPROBE_SMALL(APPLET_NOEXEC(insmod, insmod, BB_DIR_SBIN, BB_SUID_DROP, insmod)))
17
18 //kbuild:ifneq ($(CONFIG_MODPROBE_SMALL),y)
19 //kbuild:lib-$(CONFIG_INSMOD) += insmod.o modutils.o
20 //kbuild:endif
21
22 #include "libbb.h"
23 #include "modutils.h"
24
25 /* 2.6 style insmod has no options and required filename
26  * (not module name - .ko can't be omitted) */
27
28 //usage:#if !ENABLE_MODPROBE_SMALL
29 //usage:#define insmod_trivial_usage
30 //usage:        IF_FEATURE_2_4_MODULES("[OPTIONS] MODULE")
31 //usage:        IF_NOT_FEATURE_2_4_MODULES("FILE")
32 //usage:        IF_FEATURE_CMDLINE_MODULE_OPTIONS(" [SYMBOL=VALUE]...")
33 //usage:#define insmod_full_usage "\n\n"
34 //usage:       "Load kernel module"
35 //usage:        IF_FEATURE_2_4_MODULES( "\n"
36 //usage:     "\n        -f      Force module to load into the wrong kernel version"
37 //usage:     "\n        -k      Make module autoclean-able"
38 //usage:     "\n        -v      Verbose"
39 //usage:     "\n        -q      Quiet"
40 //usage:     "\n        -L      Lock: prevent simultaneous loads"
41 //usage:        IF_FEATURE_INSMOD_LOAD_MAP(
42 //usage:     "\n        -m      Output load map to stdout"
43 //usage:        )
44 //usage:     "\n        -x      Don't export externs"
45 //usage:        )
46 //usage:#endif
47
48 int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
49 int insmod_main(int argc UNUSED_PARAM, char **argv)
50 {
51         char *filename;
52         int rc;
53
54         /* Compat note:
55          * 2.6 style insmod has no options and required filename
56          * (not module name - .ko can't be omitted).
57          * 2.4 style insmod can take module name without .o
58          * and performs module search in default directories
59          * or in $MODPATH.
60          */
61
62         IF_FEATURE_2_4_MODULES(
63                 getopt32(argv, INSMOD_OPTS INSMOD_ARGS);
64                 argv += optind - 1;
65         );
66
67         filename = *++argv;
68         if (!filename)
69                 bb_show_usage();
70
71         rc = bb_init_module(filename, parse_cmdline_module_options(argv, /*quote_spaces:*/ 0));
72         if (rc)
73                 bb_error_msg("can't insert '%s': %s", filename, moderror(rc));
74
75         return rc;
76 }