[BusyBox-cvs] CVS update of busybox/modutils (modprobe.c)

Erik Andersen andersen at codepoet.org
Thu Aug 19 18:30:31 UTC 2004


    Date: Thursday, August 19, 2004 @ 12:30:31
  Author: andersen
    Path: /var/cvs/busybox/modutils

Modified: modprobe.c (1.39 -> 1.40)

Patch from Mike Castle to cleanup some modutils issues, in
particular making alias support work better.


Index: busybox/modutils/modprobe.c
diff -u busybox/modutils/modprobe.c:1.39 busybox/modutils/modprobe.c:1.40
--- busybox/modutils/modprobe.c:1.39	Mon Aug 16 04:22:34 2004
+++ busybox/modutils/modprobe.c	Thu Aug 19 12:30:31 2004
@@ -34,7 +34,8 @@
 
 
 struct dep_t {
-	char *  m_module;
+	char *  m_name;
+	char *  m_path;
 	char *  m_options;
 
 	int     m_isalias  : 1;
@@ -47,7 +48,8 @@
 };
 
 struct mod_list_t {
-	char *  m_module;
+	char *  m_name;
+	char *  m_path;
 	char *  m_options;
 
 	struct mod_list_t * m_prev;
@@ -159,11 +161,12 @@
 
 		if ( !continuation_line ) {
 			char *col = strchr ( buffer, ':' );
+			char *dot = col;
 
 			if ( col ) {
 				char *mods;
+				char *modpath;
 				char *mod;
-				int ext = 0;
 
 				*col = 0;
 				mods = strrchr ( buffer, '/' );
@@ -173,16 +176,19 @@
 				else
 					mods++;
 
+				modpath = strchr ( buffer, '/' );
+				if ( !modpath )
+					modpath = buffer;
 #if defined(CONFIG_FEATURE_2_6_MODULES)
 				if ((k_version > 4) && ( *(col-3) == '.' ) &&
 						( *(col-2) == 'k' ) && ( *(col-1) == 'o' ))
-					ext = 3;
+					dot = col - 3;
 				else
 #endif
 					if (( *(col-2) == '.' ) && ( *(col-1) == 'o' ))
-						ext = 2;
+						dot = col - 2;
 
-				mod = bb_xstrndup ( buffer, col - buffer );
+				mod = bb_xstrndup ( mods, dot - mods );
 
 				if ( !current ) {
 					first = current = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
@@ -191,7 +197,8 @@
 					current-> m_next = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
 					current = current-> m_next;
 				}
-				current-> m_module  = mod;
+				current-> m_name  = mod;
+				current-> m_path  = bb_xstrdup(modpath);
 				current-> m_options = 0;
 				current-> m_isalias = 0;
 				current-> m_depcnt  = 0;
@@ -317,7 +324,7 @@
 						current-> m_next = (struct dep_t *) xcalloc ( 1, sizeof ( struct dep_t ));
 						current = current-> m_next;
 					}
-					current-> m_module  = bb_xstrdup ( alias );
+					current-> m_name  = bb_xstrdup ( alias );
 					current-> m_isalias = 1;
 
 					if (( strcmp ( mod, "off" ) == 0 ) || ( strcmp ( mod, "null" ) == 0 )) {
@@ -339,14 +346,14 @@
 					struct dep_t *dt;
 
 					for ( dt = first; dt; dt = dt-> m_next ) {
-						if ( strcmp ( dt-> m_module, mod ) == 0 )
+						if ( strcmp ( dt-> m_name, mod ) == 0 )
 							break;
 					}
 					if ( dt ) {
 						dt-> m_options = xrealloc ( dt-> m_options, bb_strlen( opt ) + 1 );
 						strcpy ( dt-> m_options, opt );
 
-						// fprintf ( stderr, "OPTION: '%s' -> '%s'\n", dt-> m_module, dt-> m_options );
+						// fprintf ( stderr, "OPTION: '%s' -> '%s'\n", dt-> m_name, dt-> m_options );
 					}
 				}
 			}
@@ -357,29 +364,6 @@
 	return first;
 }
 
-/* check if /lib/modules/bar/foo.ko belongs to module foo */
-/* return 1 = found, 0 = not found                        */
-static int mod_strcmp ( const char *mod_path, const char *mod_name )
-{
-	/* last path component */
-	const char *last_comp = strrchr (mod_path, '/'); 
-	const char *mod_ext = ".o";
-
-#if defined(CONFIG_FEATURE_2_6_MODULES)
-	if ( k_version > 4 )
-		mod_ext = ".ko";
-#endif
-
-	last_comp = last_comp ? last_comp + 1 : mod_path;
-
-	return (strncmp(last_comp,
-					 mod_name,
-					 strlen(mod_name)) == 0 ) &&
-		   ((strcmp(last_comp + strlen (mod_name), mod_ext) == 0) || last_comp[strlen(mod_name)] == 0) &&
-		   (strcmp(mod_path + strlen(mod_path) -
-					strlen(mod_ext), mod_ext) == 0);
-}
-
 /* return 1 = loaded, 0 = not loaded, -1 = can't tell */
 static int already_loaded (const char *name)
 {
@@ -396,7 +380,7 @@
 		p = strchr (buffer, ' ');
 		if (p) {
 			*p = 0;
-			if (mod_strcmp (name, buffer)) {
+			if (strcmp (name, buffer) == 0) {
 				close (fd);
 				return 1;
 			}
@@ -415,15 +399,16 @@
 	while ( list ) {
 		*lcmd = '\0';
 		if ( do_insert ) {
-			if (already_loaded (list->m_module) != 1)
+			if (already_loaded (list->m_name) != 1)
 				snprintf ( lcmd, sizeof( lcmd ) - 1, "insmod %s %s %s %s %s",
 						do_syslog ? "-s" : "", autoclean ? "-k" : "",
-						quiet ? "-q" : "", list-> m_module, list-> m_options ?
+						quiet ? "-q" : "", list-> m_path, list-> m_options ?
 						list-> m_options : "" );
 		} else {
-			if (already_loaded (list->m_module) != 0)
+			/* modutils uses short name for removal */
+			if (already_loaded (list->m_name) != 0)
 				snprintf ( lcmd, sizeof( lcmd ) - 1, "rmmod %s %s",
-						do_syslog ? "-s" : "", list-> m_module );
+						do_syslog ? "-s" : "", list-> m_name );
 		}
 
 		if (*lcmd) {
@@ -450,24 +435,13 @@
 	struct mod_list_t *find;
 	struct dep_t *dt;
 	char *opt = 0;
-	int lm;
-
-	// 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;
+	char *path = 0;
 
 	// check dependencies
 	for ( dt = depend; dt; dt = dt-> m_next ) {
-		if ( mod_strcmp ( dt-> m_module, mod )) {
-			mod = dt-> m_module;
+		if ( strcmp ( dt-> m_name, mod ) == 0) {
+			mod = dt-> m_name;
+			path = dt-> m_path;
 			opt = dt-> m_options;
 			break;
 		}
@@ -479,12 +453,13 @@
 			struct dep_t *adt;
 
 			for ( adt = depend; adt; adt = adt-> m_next ) {
-				if ( strcmp ( adt-> m_module, dt-> m_deparr [0] ) == 0 )
+				if ( strcmp ( adt-> m_name, dt-> m_deparr [0] ) == 0 )
 					break;
 			}
 			if ( adt ) {
 				dt = adt;
-				mod = dt-> m_module;
+				mod = dt-> m_name;
+				path = dt-> m_path;
 				if ( !opt )
 					opt = dt-> m_options;
 			}
@@ -497,7 +472,7 @@
 
 	// search for duplicates
 	for ( find = *head; find; find = find-> m_next ) {
-		if ( !strcmp ( mod, find-> m_module )) {
+		if ( !strcmp ( mod, find-> m_name )) {
 			// found -> dequeue it
 
 			if ( find-> m_prev )
@@ -516,7 +491,8 @@
 
 	if ( !find ) { // did not find a duplicate
 		find = (struct mod_list_t *) xmalloc ( sizeof(struct mod_list_t));
-		find-> m_module = mod;
+		find-> m_name = mod;
+		find-> m_path = path;
 		find-> m_options = opt;
 	}
 
@@ -599,8 +575,6 @@
 
 }
 
-
-
 extern int modprobe_main(int argc, char** argv)
 {
 	int	opt;



More information about the busybox-cvs mailing list