modprobe now also uses "options" from /etc/modules.conf
This commit is contained in:
parent
d0dd3d31e2
commit
aead70b4d1
@ -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,41 +248,49 @@ 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 ))
|
if ( !current ) {
|
||||||
alias++;
|
first = current = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
|
||||||
mod = alias;
|
}
|
||||||
while ( !isspace ( *mod ))
|
else {
|
||||||
mod++;
|
current-> m_next = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
|
||||||
*mod = 0;
|
current = current-> m_next;
|
||||||
mod++;
|
}
|
||||||
while ( isspace ( *mod ))
|
current-> m_module = xstrdup ( alias );
|
||||||
mod++;
|
current-> m_isalias = 1;
|
||||||
|
|
||||||
// fprintf ( stderr, "ALIAS: '%s' -> '%s'\n", alias, mod );
|
if (( strcmp ( alias, "off" ) == 0 ) || ( strcmp ( alias, "null" ) == 0 )) {
|
||||||
|
current-> m_depcnt = 0;
|
||||||
if ( !current ) {
|
current-> m_deparr = 0;
|
||||||
first = current = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
|
}
|
||||||
|
else {
|
||||||
|
current-> m_depcnt = 1;
|
||||||
|
current-> m_deparr = xmalloc ( 1 * sizeof( char * ));
|
||||||
|
current-> m_deparr[0] = xstrdup ( mod );
|
||||||
|
}
|
||||||
|
current-> m_next = 0;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
current-> m_next = (struct dep_t *) xmalloc ( sizeof ( struct dep_t ));
|
|
||||||
current = current-> m_next;
|
|
||||||
}
|
|
||||||
current-> m_module = xstrdup ( alias );
|
|
||||||
current-> m_isalias = 1;
|
|
||||||
|
|
||||||
if (( strcmp ( alias, "off" ) == 0 ) || ( strcmp ( alias, "null" ) == 0 )) {
|
|
||||||
current-> m_depcnt = 0;
|
|
||||||
current-> m_deparr = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
current-> m_depcnt = 1;
|
|
||||||
current-> m_deparr = xmalloc ( 1 * sizeof( char * ));
|
|
||||||
current-> m_deparr[0] = xstrdup ( mod );
|
|
||||||
}
|
|
||||||
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,16 +337,31 @@ 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
|
// resolve alias names
|
||||||
if ( dt && dt-> m_isalias ) {
|
while ( dt && dt-> m_isalias ) {
|
||||||
if ( dt-> m_depcnt == 1 )
|
if ( dt-> m_depcnt == 1 ) {
|
||||||
check_dep ( dt-> m_deparr [0], head, tail );
|
struct dep_t *adt;
|
||||||
printf ( "Got alias: %s -> %s\n", mod, dt-> m_deparr [0] );
|
|
||||||
|
for ( adt = depend; adt; adt = adt-> m_next ) {
|
||||||
return;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// search for duplicates
|
// search for duplicates
|
||||||
@ -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,21 +419,23 @@ 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 ) {
|
||||||
int i;
|
if ( argc ) {
|
||||||
int l = 0;
|
int i;
|
||||||
|
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
|
||||||
rc |= mod_process ( tail, 1 );
|
rc |= mod_process ( tail, 1 );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user