vanhofen
3 years ago
3 changed files with 32 additions and 175 deletions
@ -1,162 +0,0 @@ |
|||||
diff --git a/modutils/Config.src b/modutils/Config.src
|
|
||||
index 9b76c83..c7579c5 100644
|
|
||||
--- a/modutils/Config.src
|
|
||||
+++ b/modutils/Config.src
|
|
||||
@@ -166,7 +166,7 @@ config FEATURE_MODUTILS_SYMBOLS
|
|
||||
config DEFAULT_MODULES_DIR |
|
||||
string "Default directory containing modules" |
|
||||
default "/lib/modules" |
|
||||
- depends on DEPMOD || MODPROBE || MODINFO
|
|
||||
+ depends on DEPMOD || MODPROBE || MODINFO || INSMOD
|
|
||||
help |
|
||||
Directory that contains kernel modules. |
|
||||
Defaults to "/lib/modules" |
|
||||
diff --git a/modutils/insmod.c b/modutils/insmod.c
|
|
||||
index 8526979..d36acc4 100644
|
|
||||
--- a/modutils/insmod.c
|
|
||||
+++ b/modutils/insmod.c
|
|
||||
@@ -45,11 +45,42 @@
|
|
||||
//usage: ) |
|
||||
//usage:#endif |
|
||||
|
|
||||
+#include <sys/utsname.h>
|
|
||||
+static char *m_filename;
|
|
||||
+static char *m_fullName;
|
|
||||
+
|
|
||||
+static int FAST_FUNC check_module_name_match(const char *filename,
|
|
||||
+ struct stat *statbuf UNUSED_PARAM,
|
|
||||
+ void *userdata, int depth UNUSED_PARAM)
|
|
||||
+{
|
|
||||
+ char *fullname = (char *) userdata;
|
|
||||
+ char *tmp;
|
|
||||
+
|
|
||||
+ if (fullname[0] == '\0')
|
|
||||
+ return FALSE;
|
|
||||
+
|
|
||||
+ tmp = bb_get_last_path_component_nostrip(filename);
|
|
||||
+ if (strcmp(tmp, fullname) == 0) {
|
|
||||
+ /* Stop searching if we find a match */
|
|
||||
+ m_filename = xstrdup(filename);
|
|
||||
+ return FALSE;
|
|
||||
+ }
|
|
||||
+ return TRUE;
|
|
||||
+}
|
|
||||
+
|
|
||||
int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
|
||||
int insmod_main(int argc UNUSED_PARAM, char **argv) |
|
||||
{ |
|
||||
char *filename; |
|
||||
int rc; |
|
||||
+int len;
|
|
||||
+char *tmp;
|
|
||||
+char *tmp2;
|
|
||||
+int k_version = 0;
|
|
||||
+struct stat st;
|
|
||||
+struct utsname uts;
|
|
||||
+char *m_name;
|
|
||||
+FILE *fp;
|
|
||||
|
|
||||
/* Compat note: |
|
||||
* 2.6 style insmod has no options and required filename |
|
||||
@@ -68,9 +99,99 @@ int insmod_main(int argc UNUSED_PARAM, char **argv)
|
|
||||
if (!filename) |
|
||||
bb_show_usage(); |
|
||||
|
|
||||
- rc = bb_init_module(filename, parse_cmdline_module_options(argv, /*quote_spaces:*/ 0));
|
|
||||
+ /* Grab the module name */
|
|
||||
+ tmp = xstrdup(filename);
|
|
||||
+ len = strlen(filename);
|
|
||||
+
|
|
||||
+ if (uname(&uts) == 0) {
|
|
||||
+ if (uts.release[0] == '2') {
|
|
||||
+ k_version = uts.release[2] - '0';
|
|
||||
+ }
|
|
||||
+ }
|
|
||||
+
|
|
||||
+ if (k_version > 4 && len > 3 && tmp[len - 3] == '.'
|
|
||||
+ && tmp[len - 2] == 'k' && tmp[len - 1] == 'o'
|
|
||||
+ ) {
|
|
||||
+ len -= 3;
|
|
||||
+ tmp[len] = '\0';
|
|
||||
+ } else
|
|
||||
+ if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
|
|
||||
+ len -= 2;
|
|
||||
+ tmp[len] = '\0';
|
|
||||
+ }
|
|
||||
+
|
|
||||
+ if (k_version > 4)
|
|
||||
+ m_fullName = xasprintf("%s.ko", tmp);
|
|
||||
+ else
|
|
||||
+ m_fullName = xasprintf("%s.o", tmp);
|
|
||||
+
|
|
||||
+ if (!m_name) {
|
|
||||
+ m_name = tmp;
|
|
||||
+ }
|
|
||||
+ free(tmp);
|
|
||||
+
|
|
||||
+ /* first look in /var/lib/modules */
|
|
||||
+ tmp2 = alloca(strlen(m_fullName) + sizeof("/var/lib/modules/"));
|
|
||||
+ strcpy(tmp2, "/var/lib/modules/");
|
|
||||
+ strcat(tmp2, m_fullName);
|
|
||||
+ if (stat(tmp2, &st) >= 0 && S_ISREG(st.st_mode) && (fp = fopen(tmp2, "r")) != NULL) {
|
|
||||
+ m_filename = xstrdup(tmp2);
|
|
||||
+ printf("insmod: preferring module %s\n", m_filename);
|
|
||||
+ } else
|
|
||||
+ /* Get a filedesc for the module. Check that we have a complete path */
|
|
||||
+ if (stat(filename, &st) < 0 || !S_ISREG(st.st_mode)
|
|
||||
+ || (fp = fopen_for_read(filename)) == NULL
|
|
||||
+ ) {
|
|
||||
+ /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
|
|
||||
+ * but do not error out yet if we fail to find it... */
|
|
||||
+ if (k_version) { /* uname succeedd */
|
|
||||
+ char *module_dir;
|
|
||||
+ char *tmdn;
|
|
||||
+
|
|
||||
+ tmdn = concat_path_file(CONFIG_DEFAULT_MODULES_DIR, uts.release);
|
|
||||
+ /* Jump through hoops in case /lib/modules/`uname -r`
|
|
||||
+ * is a symlink. We do not want recursive_action to
|
|
||||
+ * follow symlinks, but we do want to follow the
|
|
||||
+ * /lib/modules/`uname -r` dir, So resolve it ourselves
|
|
||||
+ * if it is a link... */
|
|
||||
+ module_dir = xmalloc_readlink(tmdn);
|
|
||||
+ if (!module_dir)
|
|
||||
+ module_dir = xstrdup(tmdn);
|
|
||||
+ recursive_action(module_dir, ACTION_RECURSE,
|
|
||||
+ check_module_name_match, NULL, m_fullName, 0);
|
|
||||
+ free(module_dir);
|
|
||||
+ free(tmdn);
|
|
||||
+ }
|
|
||||
+
|
|
||||
+ /* Check if we have found anything yet */
|
|
||||
+ if (!m_filename || ((fp = fopen_for_read(m_filename)) == NULL)) {
|
|
||||
+ int r;
|
|
||||
+ char *module_dir;
|
|
||||
+
|
|
||||
+ free(m_filename);
|
|
||||
+ m_filename = NULL;
|
|
||||
+ module_dir = xmalloc_readlink(CONFIG_DEFAULT_MODULES_DIR);
|
|
||||
+ if (!module_dir)
|
|
||||
+ module_dir = xstrdup(CONFIG_DEFAULT_MODULES_DIR);
|
|
||||
+ /* No module found under /lib/modules/`uname -r`, this
|
|
||||
+ * time cast the net a bit wider. Search /lib/modules/ */
|
|
||||
+ r = recursive_action(module_dir, ACTION_RECURSE,
|
|
||||
+ check_module_name_match, NULL, m_fullName, 0);
|
|
||||
+ if (r)
|
|
||||
+ bb_error_msg_and_die("%s: module not found", m_fullName);
|
|
||||
+ free(module_dir);
|
|
||||
+ if (m_filename == NULL
|
|
||||
+ || ((fp = fopen_for_read(m_filename)) == NULL)
|
|
||||
+ ) {
|
|
||||
+ bb_error_msg_and_die("%s: module not found", m_fullName);
|
|
||||
+ }
|
|
||||
+ }
|
|
||||
+ } else
|
|
||||
+ m_filename = xstrdup(filename);
|
|
||||
+
|
|
||||
+ rc = bb_init_module(m_filename, parse_cmdline_module_options(argv, /*quote_spaces:*/ 0));
|
|
||||
if (rc) |
|
||||
- bb_error_msg("can't insert '%s': %s", filename, moderror(rc));
|
|
||||
+ bb_error_msg("can't insert '%s': %s", m_filename, moderror(rc));
|
|
||||
|
|
||||
return rc; |
|
||||
} |
|
Loading…
Reference in new issue