fix insmod search when 2.4 module support is disabled
SVN-Revision: 7528
This commit is contained in:
parent
741dbcff16
commit
a2f2b9cfad
1 changed files with 196 additions and 0 deletions
196
package/busybox/patches/999-insmod2.6_search.patch
Normal file
196
package/busybox/patches/999-insmod2.6_search.patch
Normal file
|
@ -0,0 +1,196 @@
|
|||
--- busybox/modutils/insmod.c 2007-05-11 12:10:43.000000000 +0200
|
||||
+++ busybox/modutils/insmod.c 2007-05-11 12:12:15.000000000 +0200
|
||||
@@ -75,6 +75,30 @@
|
||||
extern int insmod_ng_main( int argc, char **argv);
|
||||
#endif
|
||||
|
||||
+static char *m_filename;
|
||||
+static char *m_fullName;
|
||||
+#define _PATH_MODULES "/lib/modules"
|
||||
+
|
||||
+static int check_module_name_match(const char *filename, struct stat *statbuf,
|
||||
+ void *userdata, int depth)
|
||||
+{
|
||||
+ char *fullname = (char *) userdata;
|
||||
+
|
||||
+ if (fullname[0] == '\0')
|
||||
+ return FALSE;
|
||||
+ else {
|
||||
+ char *tmp, *tmp1 = xstrdup(filename);
|
||||
+ tmp = bb_get_last_path_component(tmp1);
|
||||
+ if (strcmp(tmp, fullname) == 0) {
|
||||
+ free(tmp1);
|
||||
+ /* Stop searching if we find a match */
|
||||
+ m_filename = xstrdup(filename);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+ free(tmp1);
|
||||
+ }
|
||||
+ return TRUE;
|
||||
+}
|
||||
|
||||
#if ENABLE_FEATURE_2_4_MODULES
|
||||
|
||||
@@ -680,7 +704,6 @@
|
||||
#endif
|
||||
|
||||
|
||||
-#define _PATH_MODULES "/lib/modules"
|
||||
enum { STRVERSIONLEN = 64 };
|
||||
|
||||
/*======================================================================*/
|
||||
@@ -793,37 +816,6 @@
|
||||
static int n_ext_modules_used;
|
||||
extern int delete_module(const char *);
|
||||
|
||||
-static char *m_filename;
|
||||
-static char *m_fullName;
|
||||
-
|
||||
-
|
||||
-/*======================================================================*/
|
||||
-
|
||||
-
|
||||
-static int check_module_name_match(const char *filename, struct stat *statbuf,
|
||||
- void *userdata, int depth)
|
||||
-{
|
||||
- char *fullname = (char *) userdata;
|
||||
-
|
||||
- if (fullname[0] == '\0')
|
||||
- return FALSE;
|
||||
- else {
|
||||
- char *tmp, *tmp1 = xstrdup(filename);
|
||||
- tmp = bb_get_last_path_component(tmp1);
|
||||
- if (strcmp(tmp, fullname) == 0) {
|
||||
- free(tmp1);
|
||||
- /* Stop searching if we find a match */
|
||||
- m_filename = xstrdup(filename);
|
||||
- return FALSE;
|
||||
- }
|
||||
- free(tmp1);
|
||||
- }
|
||||
- return TRUE;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/*======================================================================*/
|
||||
-
|
||||
static struct obj_file *arch_new_file(void)
|
||||
{
|
||||
struct arch_file *f;
|
||||
@@ -4265,14 +4257,97 @@
|
||||
long ret;
|
||||
size_t len;
|
||||
void *map;
|
||||
- char *filename, *options;
|
||||
+ char *options, *tmp;
|
||||
+ struct stat st;
|
||||
+#if ENABLE_FEATURE_CLEAN_UP
|
||||
+ FILE *fp = 0;
|
||||
+#else
|
||||
+ FILE *fp;
|
||||
+#endif
|
||||
+ int k_version = 0;
|
||||
+ struct utsname myuname;
|
||||
|
||||
- filename = *++argv;
|
||||
- if (!filename)
|
||||
+ if (argc < 2)
|
||||
bb_show_usage();
|
||||
|
||||
+#if !ENABLE_FEATURE_2_4_MODULES
|
||||
+ /* Grab the module name */
|
||||
+ tmp = basename(xstrdup(argv[1]));
|
||||
+ len = strlen(tmp);
|
||||
+
|
||||
+ if (uname(&myuname) == 0) {
|
||||
+ if (myuname.release[0] == '2') {
|
||||
+ k_version = myuname.release[2] - '0';
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (len > 3 && tmp[len - 3] == '.' && tmp[len - 2] == 'k' && tmp[len - 1] == 'o') {
|
||||
+ len -= 3;
|
||||
+ tmp[len] = '\0';
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ m_fullName = xasprintf("%s.ko", tmp);
|
||||
+
|
||||
+ /* Get a filedesc for the module. Check we we have a complete path */
|
||||
+ if (stat(argv[1], &st) < 0 || !S_ISREG(st.st_mode)
|
||||
+ || (fp = fopen(argv[1], "r")) == 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;
|
||||
+ char real_module_dir[FILENAME_MAX];
|
||||
+
|
||||
+ tmdn = concat_path_file(_PATH_MODULES, myuname.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... */
|
||||
+ if (realpath(tmdn, real_module_dir) == NULL)
|
||||
+ module_dir = tmdn;
|
||||
+ else
|
||||
+ module_dir = real_module_dir;
|
||||
+ recursive_action(module_dir, TRUE, FALSE, FALSE,
|
||||
+ check_module_name_match, 0, m_fullName, 0);
|
||||
+ free(tmdn);
|
||||
+ }
|
||||
+
|
||||
+ /* Check if we have found anything yet */
|
||||
+ if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL)) {
|
||||
+ char module_dir[FILENAME_MAX];
|
||||
+
|
||||
+ free(m_filename);
|
||||
+ m_filename = 0;
|
||||
+ if (realpath (_PATH_MODULES, module_dir) == NULL)
|
||||
+ strcpy(module_dir, _PATH_MODULES);
|
||||
+ /* No module found under /lib/modules/`uname -r`, this
|
||||
+ * time cast the net a bit wider. Search /lib/modules/ */
|
||||
+ if (!recursive_action(module_dir, TRUE, FALSE, FALSE,
|
||||
+ check_module_name_match, 0, m_fullName, 0)
|
||||
+ ) {
|
||||
+ if (m_filename == 0
|
||||
+ || ((fp = fopen(m_filename, "r")) == NULL)
|
||||
+ ) {
|
||||
+ bb_error_msg("%s: no module by that name found", m_fullName);
|
||||
+#if ENABLE_FEATURE_CLEAN_UP
|
||||
+ if(fp)
|
||||
+ fclose(fp);
|
||||
+ free(m_filename);
|
||||
+#endif
|
||||
+ }
|
||||
+ } else
|
||||
+ bb_error_msg_and_die("%s: no module by that name found", m_fullName);
|
||||
+ }
|
||||
+ } else
|
||||
+ m_filename = xstrdup(argv[1]);
|
||||
+#endif
|
||||
+
|
||||
/* Rest is options */
|
||||
options = xstrdup("");
|
||||
+ argv++;
|
||||
while (*++argv) {
|
||||
int optlen = strlen(options);
|
||||
options = xrealloc(options, optlen + 2 + strlen(*argv) + 2);
|
||||
@@ -4300,13 +4375,13 @@
|
||||
}
|
||||
#else
|
||||
len = MAXINT(ssize_t);
|
||||
- map = xmalloc_open_read_close(filename, &len);
|
||||
+ map = xmalloc_open_read_close(m_filename, &len);
|
||||
#endif
|
||||
|
||||
ret = syscall(__NR_init_module, map, len, options);
|
||||
if (ret != 0) {
|
||||
bb_perror_msg_and_die("cannot insert '%s': %s (%li)",
|
||||
- filename, moderror(errno), ret);
|
||||
+ m_filename, moderror(errno), ret);
|
||||
}
|
||||
|
||||
return 0;
|
Loading…
Reference in a new issue