From dbd58c1d4d109832d89e168fc50f30235fd88dd9 Mon Sep 17 00:00:00 2001
From: kaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Fri, 8 Jun 2007 10:26:34 +0000
Subject: fix insmod search when 2.4 module support is disabled

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@7528 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/busybox/patches/999-insmod2.6_search.patch | 196 +++++++++++++++++++++
 1 file changed, 196 insertions(+)
 create mode 100644 package/busybox/patches/999-insmod2.6_search.patch

(limited to 'package/busybox/patches')

diff --git a/package/busybox/patches/999-insmod2.6_search.patch b/package/busybox/patches/999-insmod2.6_search.patch
new file mode 100644
index 000000000..5a93b0288
--- /dev/null
+++ b/package/busybox/patches/999-insmod2.6_search.patch
@@ -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;
-- 
cgit v1.2.3