From 807bd846b6428920eb2f10875f19a7e48d8cfdd7 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 19 Aug 2004 18:30:31 +0000 Subject: Patch from Mike Castle to cleanup some modutils issues, in particular making alias support work better. --- modutils/modprobe.c | 92 +++++++++++++++++++---------------------------------- 1 file changed, 33 insertions(+), 59 deletions(-) (limited to 'modutils') diff --git a/modutils/modprobe.c b/modutils/modprobe.c index 7d6115380..98003ca16 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -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; -- cgit v1.2.3