[BusyBox-cvs] busybox/modutils insmod.c, 1.107, 1.108 modprobe.c, 1.23, 1.24

Erik Andersen andersen at busybox.net
Fri Dec 19 21:04:22 UTC 2003


Update of /var/cvs/busybox/modutils
In directory nail:/tmp/cvs-serv25736/modutils

Modified Files:
	insmod.c modprobe.c 
Log Message:
Patch from Woody Suwalski:

Erik, I think we have met online some time ago when I was in Corel/Rebel
    Netwinder project....                                               

Anyway, I would like to use BB on 2.6.0 initrd. 1.00-pre4 works OK, if
insmod is actually presented with a full path to the module. Otherwise -
problems (not to mention conflicts when 2.4 modutil is enabled)

Here are some patches for insmod and modprobe which try to walk around
the default ".o" module format for 2.2/2.4 modules (you have probably
noticed it is now .ko in 2.6 ;-)) Trying to steal as little space as
possible if 2.6 not enabled...

The modprobe is still not perfect on 2.6 - seems to be jamming on some
dependencies, but works with some (to be debugged). Anyway after the
patches it at least tries to work....

Will there be a 1.00-pre5 coming any time soon?

Thanks, Woody



Index: modprobe.c
===================================================================
RCS file: /var/cvs/busybox/modutils/modprobe.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- modprobe.c	14 Nov 2003 02:49:19 -0000	1.23
+++ modprobe.c	19 Dec 2003 21:04:19 -0000	1.24
@@ -57,6 +57,7 @@
 
 static struct dep_t *depend;
 static int autoclean, show_only, quiet, do_syslog, verbose;
+static int k_version;
 
 int parse_tag_value ( char *buffer, char **ptag, char **pvalue )
 {
@@ -116,6 +117,7 @@
 	char *filename = buffer;
 	int continuation_line = 0;
 	
+	k_version = 0;
 	if ( uname ( &un ))
 		return 0;
 		
@@ -123,6 +125,9 @@
 	if ( bb_strlen ( un.release ) > ( sizeof( buffer ) - 64 )) {
 		return 0;
 	}
+	if (un.release[0] == '2') {
+		k_version = un.release[2] - '0';
+	}
 				
 	strcpy ( filename, "/lib/modules/" );
 	strcat ( filename, un.release );
@@ -166,6 +171,12 @@
 				else
 					mods++;
 					
+#if defined(CONFIG_FEATURE_2_6_MODULES)
+				if ((k_version > 4) && ( *(col-3) == '.' ) &&
+					( *(col-2) == 'k' ) && ( *(col-1) == 'o' ))
+					ext = 3;
+				else
+#endif
 				if (( *(col-2) == '.' ) && ( *(col-1) == 'o' ))
 					ext = 2;
 				
@@ -215,6 +226,12 @@
 			else
 				deps++;
 			
+#if defined(CONFIG_FEATURE_2_6_MODULES)
+			if ((k_version > 4) && ( *(end-2) == '.' ) && *(end-1) == 'k'  &&
+				( *end == 'o' ))
+				ext = 3;
+			else
+#endif
 			if (( *(end-1) == '.' ) && ( *end == 'o' ))
 				ext = 2;
 
@@ -383,6 +400,13 @@
 
 	// remove .o extension
 	lm = bb_strlen ( mod );
+
+#if defined(CONFIG_FEATURE_2_6_MODULES)
+	if ((k_version > 4) && ( mod [lm-3] == '.' ) &&
+		( mod [lm-2] == 'k' ) && ( mod [lm-1] == 'o' ))
+		mod [lm-3] = 0;
+	else
+#endif
 	if (( mod [lm-2] == '.' ) && ( mod [lm-1] == 'o' ))
 		mod [lm-2] = 0;
 

Index: insmod.c
===================================================================
RCS file: /var/cvs/busybox/modutils/insmod.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -d -r1.107 -r1.108
--- insmod.c	11 Dec 2003 01:42:13 -0000	1.107
+++ insmod.c	19 Dec 2003 21:04:19 -0000	1.108
@@ -4050,6 +4050,8 @@
 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP
 	int flag_print_load_map = 0;
 #endif
+	int k_version = 0;
+	struct utsname myuname;
 
 	/* Parse any options */
 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP
@@ -4098,7 +4100,7 @@
 				bb_show_usage();
 		}
 	}
-	
+
 	if (argv[optind] == NULL) {
 		bb_show_usage();
 	}
@@ -4108,12 +4110,33 @@
 	tmp = basename(tmp1);
 	len = strlen(tmp);
 
+	if (uname(&myuname) == 0) {
+		if (myuname.release[0] == '2') {
+			k_version = myuname.release[2] - '0';
+		}
+	}
+
+#if defined(CONFIG_FEATURE_2_6_MODULES)
+	if (k_version > 4 && len > 3 && tmp[len - 3] == '.' &&
+	    tmp[len - 2] == 'k' && tmp[len - 1] == 'o') {
+		len-=3;
+		tmp[len] = '\0';
+	}
+	else
+#endif
 	if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
 		len-=2;
 		tmp[len] = '\0';
 	}
 
+
+#if defined(CONFIG_FEATURE_2_6_MODULES)
+	if (k_version > 4)
+		bb_xasprintf(&m_fullName, "%s.ko", tmp);
+	else
+#else
 	bb_xasprintf(&m_fullName, "%s.o", tmp);
+#endif
 
 	if (!m_name) {
 		m_name = tmp;
@@ -4125,28 +4148,26 @@
 	/* Get a filedesc for the module.  Check we we have a complete path */
 	if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) ||
 			(fp = fopen(argv[optind], "r")) == NULL) {
-		struct utsname myuname;
-
 		/* 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 (uname(&myuname) == 0) {
-                       char *module_dir;
-                       char *tmdn;
+		if (k_version) {	/* uname succeedd */
+			char *module_dir;
+			char *tmdn;
 			char real_module_dir[FILENAME_MAX];
 
-                       tmdn = concat_path_file(_PATH_MODULES, myuname.release);
+			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);
-                       free(tmdn);
+			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);
+			free(tmdn);
 		}
 
 		/* Check if we have found anything yet */
@@ -4154,17 +4175,17 @@
 		{
 			char module_dir[FILENAME_MAX];
 
-                       free(m_filename);
-                       m_filename = 0;
+			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)) 
+						check_module_name_match, 0, m_fullName))
 			{
 				if (m_filename == 0
-						|| ((fp = fopen(m_filename, "r")) == NULL)) 
+						|| ((fp = fopen(m_filename, "r")) == NULL))
 				{
 					bb_error_msg("%s: no module by that name found", m_fullName);
 					goto out;
@@ -4172,17 +4193,18 @@
 			} else
 				bb_error_msg_and_die("%s: no module by that name found", m_fullName);
 		}
-	} else 
+	} else
 		m_filename = bb_xstrdup(argv[optind]);
 
 	printf("Using %s\n", m_filename);
 
 #ifdef CONFIG_FEATURE_2_6_MODULES
-    if (create_module(NULL, 0) < 0 && errno == ENOSYS) {
+	if (k_version > 4)
+	{
 		optind--;
-		argv[optind] = m_filename;
+		argv[optind + 1] = m_filename;
 		return insmod_ng_main(argc - optind, argv + optind);
-    }
+	}
 #endif
 
 	if ((f = obj_load(fp, LOADBITS)) == NULL)
@@ -4264,9 +4286,9 @@
 
 	/* Allocate common symbols, symbol tables, and string tables.  */
 
-	if (k_new_syscalls 
+	if (k_new_syscalls
 		? !new_create_this_module(f, m_name)
-		: !old_create_mod_use_count(f)) 
+		: !old_create_mod_use_count(f))
 	{
 		goto out;
 	}
@@ -4282,8 +4304,8 @@
 
 	if (optind < argc) {
 		if (m_has_modinfo
-			? !new_process_module_arguments(f, argc - optind, argv + optind) 
-			: !old_process_module_arguments(f, argc - optind, argv + optind)) 
+			? !new_process_module_arguments(f, argc - optind, argv + optind)
+			: !old_process_module_arguments(f, argc - optind, argv + optind))
 		{
 			goto out;
 		}
@@ -4326,16 +4348,16 @@
 		delete_module(m_name);
 		goto out;
 	}
-#endif	
+#endif
 
 	if (!obj_relocate(f, m_addr)) {
 		delete_module(m_name);
 		goto out;
 	}
 
-	if (k_new_syscalls 
+	if (k_new_syscalls
 		? !new_init_module(m_name, f, m_size)
-		: !old_init_module(m_name, f, m_size)) 
+		: !old_init_module(m_name, f, m_size))
 	{
 		delete_module(m_name);
 		goto out;




More information about the busybox-cvs mailing list