modprobe now also uses "options" from /etc/modules.conf

This commit is contained in:
Robert Griebl 2002-07-26 15:54:20 +00:00
parent d0dd3d31e2
commit aead70b4d1

View File

@ -1,9 +1,6 @@
/* vi: set sw=4 ts=4: */ /* vi: set sw=4 ts=4: */
/* /*
* really dumb modprobe implementation for busybox * Modprobe written from scratch for BusyBox
* Copyright (C) 2001 Lineo, davidm@lineo.com
*
* dependency specific stuff completly rewritten and
* copyright (c) 2002 by Robert Griebl, griebl@gmx.de * copyright (c) 2002 by Robert Griebl, griebl@gmx.de
* *
*/ */
@ -22,6 +19,7 @@
struct dep_t { struct dep_t {
char * m_module; char * m_module;
char * m_options;
int m_isalias : 1; int m_isalias : 1;
int m_reserved : 15; int m_reserved : 15;
@ -34,6 +32,7 @@ struct dep_t {
struct mod_list_t { struct mod_list_t {
char * m_module; char * m_module;
char * m_options;
struct mod_list_t * m_prev; struct mod_list_t * m_prev;
struct mod_list_t * m_next; struct mod_list_t * m_next;
@ -43,6 +42,24 @@ struct mod_list_t {
static struct dep_t *depend; static struct dep_t *depend;
static int autoclean, show_only, quiet, do_syslog, verbose; static int autoclean, show_only, quiet, do_syslog, verbose;
int parse_tag_value ( char *buffer, char **ptag, char **pvalue )
{
char *tag, *value;
while ( isspace ( *buffer ))
buffer++;
tag = value = buffer;
while ( !isspace ( *value ))
value++;
*value++ = 0;
while ( isspace ( *value ))
value++;
*ptag = tag;
*pvalue = value;
return xstrlen( tag ) && xstrlen( value );
}
/* Jump through hoops to simulate how fgets() grabs just one line at a /* Jump through hoops to simulate how fgets() grabs just one line at a
* time... Don't use any stdio since modprobe gets called from a kernel * time... Don't use any stdio since modprobe gets called from a kernel
@ -141,6 +158,7 @@ static struct dep_t *build_dep ( void )
current = current-> m_next; current = current-> m_next;
} }
current-> m_module = mod; current-> m_module = mod;
current-> m_options = 0;
current-> m_isalias = 0; current-> m_isalias = 0;
current-> m_depcnt = 0; current-> m_depcnt = 0;
current-> m_deparr = 0; current-> m_deparr = 0;
@ -230,19 +248,8 @@ static struct dep_t *build_dep ( void )
if (( strncmp ( buffer, "alias", 5 ) == 0 ) && isspace ( buffer [5] )) { if (( strncmp ( buffer, "alias", 5 ) == 0 ) && isspace ( buffer [5] )) {
char *alias, *mod; char *alias, *mod;
alias = buffer + 6; if ( parse_tag_value ( buffer + 6, &alias, &mod )) {
// fprintf ( stderr, "ALIAS: '%s' -> '%s'\n", alias, mod );
while ( isspace ( *alias ))
alias++;
mod = alias;
while ( !isspace ( *mod ))
mod++;
*mod = 0;
mod++;
while ( isspace ( *mod ))
mod++;
// fprintf ( stderr, "ALIAS: '%s' -> '%s'\n", alias, mod );
if ( !current ) { if ( !current ) {
first = current = (struct dep_t *) xmalloc ( sizeof ( struct dep_t )); first = current = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
@ -266,6 +273,25 @@ static struct dep_t *build_dep ( void )
current-> m_next = 0; current-> m_next = 0;
} }
} }
else if (( strncmp ( buffer, "options", 7 ) == 0 ) && isspace ( buffer [7] )) {
char *mod, *opt;
if ( parse_tag_value ( buffer + 8, &mod, &opt )) {
struct dep_t *dt;
for ( dt = first; dt; dt = dt-> m_next ) {
if ( strcmp ( dt-> m_module, mod ) == 0 )
break;
}
if ( dt ) {
dt-> m_options = xrealloc ( dt-> m_options, xstrlen( opt ) + 1 );
strcpy ( dt-> m_options, opt );
// fprintf ( stderr, "OPTION: '%s' -> '%s'\n", dt-> m_module, dt-> m_options );
}
}
}
}
} }
close ( fd ); close ( fd );
@ -283,7 +309,7 @@ static int mod_process ( struct mod_list_t *list, int do_insert )
while ( list ) { while ( list ) {
if ( do_insert ) if ( do_insert )
snprintf ( lcmd, sizeof( lcmd ) - 1, "insmod %s %s %s %s 2>/dev/null", do_syslog ? "-s" : "", autoclean ? "-k" : "", quiet ? "-q" : "", list-> m_module ); snprintf ( lcmd, sizeof( lcmd ) - 1, "insmod %s %s %s %s %s 2>/dev/null", do_syslog ? "-s" : "", autoclean ? "-k" : "", quiet ? "-q" : "", list-> m_module, list-> m_options ? list-> m_options : "" );
else else
snprintf ( lcmd, sizeof( lcmd ) - 1, "rmmod %s %s 2>/dev/null", do_syslog ? "-s" : "", list-> m_module ); snprintf ( lcmd, sizeof( lcmd ) - 1, "rmmod %s %s 2>/dev/null", do_syslog ? "-s" : "", list-> m_module );
@ -301,7 +327,7 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t *
{ {
struct mod_list_t *find; struct mod_list_t *find;
struct dep_t *dt; struct dep_t *dt;
char *opt = 0;
int lm; int lm;
// remove .o extension // remove .o extension
@ -311,15 +337,30 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t *
// check dependencies // check dependencies
for ( dt = depend; dt; dt = dt-> m_next ) { for ( dt = depend; dt; dt = dt-> m_next ) {
if ( strcmp ( dt-> m_module, mod ) == 0 ) if ( strcmp ( dt-> m_module, mod ) == 0 ) {
opt = dt-> m_options;
break; break;
} }
// resolve alias names }
if ( dt && dt-> m_isalias ) {
if ( dt-> m_depcnt == 1 )
check_dep ( dt-> m_deparr [0], head, tail );
printf ( "Got alias: %s -> %s\n", mod, dt-> m_deparr [0] );
// resolve alias names
while ( dt && dt-> m_isalias ) {
if ( dt-> m_depcnt == 1 ) {
struct dep_t *adt;
for ( adt = depend; adt; adt = adt-> m_next ) {
if ( strcmp ( adt-> m_module, dt-> m_deparr [0] ) == 0 ) {
if ( !opt )
opt = adt-> m_options;
break;
}
}
if ( !adt )
return;
else
dt = adt;
}
else
return; return;
} }
@ -345,6 +386,7 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t *
if ( !find ) { // did not find a duplicate if ( !find ) { // did not find a duplicate
find = (struct mod_list_t *) xmalloc ( sizeof(struct mod_list_t)); find = (struct mod_list_t *) xmalloc ( sizeof(struct mod_list_t));
find-> m_module = mod; find-> m_module = mod;
find-> m_options = opt;
} }
// enqueue at tail // enqueue at tail
@ -377,19 +419,21 @@ static int mod_insert ( char *mod, int argc, char **argv )
check_dep ( mod, &head, &tail ); check_dep ( mod, &head, &tail );
if ( head && tail ) { if ( head && tail ) {
if ( argc ) {
int i; int i;
int l = 0; int l = 0;
// append module args // append module args
l = xstrlen ( head-> m_module );
for ( i = 0; i < argc; i++ ) for ( i = 0; i < argc; i++ )
l += ( xstrlen ( argv [i] ) + 1 ); l += ( xstrlen ( argv [i] ) + 1 );
head-> m_module = xrealloc ( head-> m_module, l + 1 ); head-> m_options = xrealloc ( head-> m_options, l + 1 );
head-> m_options [0] = 0;
for ( i = 0; i < argc; i++ ) { for ( i = 0; i < argc; i++ ) {
strcat ( head-> m_module, " " ); strcat ( head-> m_options, argv [i] );
strcat ( head-> m_module, argv [i] ); strcat ( head-> m_options, " " );
}
} }
// process tail ---> head // process tail ---> head