+--- a/modutils/Config.src
++++ b/modutils/Config.src
+@@ -247,7 +247,7 @@ config FEATURE_MODUTILS_SYMBOLS
+ config DEFAULT_MODULES_DIR
+ string "Default directory containing modules"
+ default "/lib/modules"
+- depends on DEPMOD || MODPROBE || MODPROBE_SMALL || MODINFO
++ depends on DEPMOD || INSMOD || MODPROBE || MODPROBE_SMALL || MODINFO
+ help
+ Directory that contains kernel modules.
+ Defaults to "/lib/modules"
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
-@@ -9,6 +9,99 @@
+@@ -11,6 +11,106 @@
#include "libbb.h"
#include "modutils.h"
++#include <sys/utsname.h>
+#ifndef CONFIG_FEATURE_2_4_MODULES
+#include <sys/mman.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
-+#include <sys/utsname.h>
+#endif
+
+static char *g_filename = NULL;
+ char *module_dir, real_module_dir[FILENAME_MAX];
+ int len, slen, ret = ENOENT, k_version;
+ struct utsname myuname;
-+ const char *suffix;
++ const char *suffix = ".ko";
+ struct stat st;
+
+ /* check the kernel version */
-+ if ((uname(&myuname) != 0) || (myuname.release[0] != '2'))
++ if (uname(&myuname) != 0)
++ return EINVAL;
++
++ k_version = myuname.release[0] - '0';
++
++ if (k_version < 2 || k_version > 9)
+ return EINVAL;
+
-+ k_version = myuname.release[2] - '0';
++ if (k_version == 2) {
++ int k_patchlevel = myuname.release[2] - '0';
++ if (k_patchlevel <= 4)
+#if ENABLE_FEATURE_2_4_MODULES
-+ if (k_version <= 4)
-+ suffix = ".o";
-+ else
++ suffix = ".o";
++#else
++ return EINVAL;
+#endif
-+ suffix = ".ko";
++ }
+
+ len = strlen(filename);
+ slen = strlen(suffix);
+ return ret;
+}
- int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
- int insmod_main(int argc UNUSED_PARAM, char **argv)
-@@ -25,9 +118,14 @@ int insmod_main(int argc UNUSED_PARAM, c
+ /* 2.6 style insmod has no options and required filename
+ * (not module name - .ko can't be omitted) */
+@@ -58,9 +158,15 @@ int insmod_main(int argc UNUSED_PARAM, c
if (!filename)
bb_show_usage();
-- rc = bb_init_module(filename, parse_cmdline_module_options(argv));
+- rc = bb_init_module(filename, parse_cmdline_module_options(argv, /*quote_spaces:*/ 0));
+ rc = find_module(filename);
+ if (rc || (g_filename == NULL))
-+ goto done;
++ goto done;
+
-+ rc = bb_init_module(g_filename, parse_cmdline_module_options(argv));
++ rc = bb_init_module(g_filename, parse_cmdline_module_options(argv, /*quote_spaces:*/ 0));
if (rc)
- bb_error_msg("cannot insert '%s': %s", filename, moderror(rc));
--
+ bb_error_msg("can't insert '%s': %s", filename, moderror(rc));
+ free (g_filename);
+
+done:
return rc;
}