--- 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;
