Patch from Mike Castle to cleanup some modutils issues, in
particular making alias support work better.
This commit is contained in:
		| @@ -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 dep_t { | ||||
| }; | ||||
|  | ||||
| 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 @@ static struct dep_t *build_dep ( void ) | ||||
|  | ||||
| 		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 @@ static struct dep_t *build_dep ( void ) | ||||
| 				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 @@ static struct dep_t *build_dep ( void ) | ||||
| 					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 @@ static struct dep_t *build_dep ( void ) | ||||
| 						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 @@ static struct dep_t *build_dep ( void ) | ||||
| 					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 @@ static struct dep_t *build_dep ( void ) | ||||
| 	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 @@ static int already_loaded (const char *name) | ||||
| 		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 @@ static int mod_process ( struct mod_list_t *list, int do_insert ) | ||||
| 	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 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t * | ||||
| 	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 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t * | ||||
| 			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 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t * | ||||
|  | ||||
| 	// 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 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t * | ||||
|  | ||||
| 	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 @@ static int mod_remove ( char *mod ) | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| extern int modprobe_main(int argc, char** argv) | ||||
| { | ||||
| 	int	opt; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user