From 03d8091859f45a6bb5e3aadc110b279e789399f2 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Fri, 19 Dec 2003 21:04:19 +0000 Subject: [PATCH] Patch from Woody Suwalski: Erik, I think we have met online some time ago when I was in Corel/Rebel Netwinder project.... Anyway, I would like to use BB on 2.6.0 initrd. 1.00-pre4 works OK, if insmod is actually presented with a full path to the module. Otherwise - problems (not to mention conflicts when 2.4 modutil is enabled) Here are some patches for insmod and modprobe which try to walk around the default ".o" module format for 2.2/2.4 modules (you have probably noticed it is now .ko in 2.6 ;-)) Trying to steal as little space as possible if 2.6 not enabled... The modprobe is still not perfect on 2.6 - seems to be jamming on some dependencies, but works with some (to be debugged). Anyway after the patches it at least tries to work.... Will there be a 1.00-pre5 coming any time soon? Thanks, Woody --- modutils/insmod.c | 84 ++++++++++++++++++++++++++++----------------- modutils/modprobe.c | 24 +++++++++++++ 2 files changed, 77 insertions(+), 31 deletions(-) diff --git a/modutils/insmod.c b/modutils/insmod.c index 979c41f78..554c97693 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c @@ -282,7 +282,7 @@ extern int insmod_ng_main( int argc, char **argv); #ifndef MODUTILS_MODULE_H static const int MODUTILS_MODULE_H = 1; -#ident "$Id: insmod.c,v 1.107 2003/12/11 01:42:13 andersen Exp $" +#ident "$Id: insmod.c,v 1.108 2003/12/19 21:04:19 andersen Exp $" /* This file contains the structures used by the 2.0 and 2.1 kernels. We do not use the kernel headers directly because we do not wish @@ -503,7 +503,7 @@ int delete_module(const char *); #ifndef MODUTILS_OBJ_H static const int MODUTILS_OBJ_H = 1; -#ident "$Id: insmod.c,v 1.107 2003/12/11 01:42:13 andersen Exp $" +#ident "$Id: insmod.c,v 1.108 2003/12/19 21:04:19 andersen Exp $" /* The relocatable object is manipulated using elfin types. */ @@ -4050,6 +4050,8 @@ extern int insmod_main( int argc, char **argv) #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP int flag_print_load_map = 0; #endif + int k_version = 0; + struct utsname myuname; /* Parse any options */ #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP @@ -4098,7 +4100,7 @@ extern int insmod_main( int argc, char **argv) bb_show_usage(); } } - + if (argv[optind] == NULL) { bb_show_usage(); } @@ -4108,12 +4110,33 @@ extern int insmod_main( int argc, char **argv) tmp = basename(tmp1); len = strlen(tmp); + if (uname(&myuname) == 0) { + if (myuname.release[0] == '2') { + k_version = myuname.release[2] - '0'; + } + } + +#if defined(CONFIG_FEATURE_2_6_MODULES) + if (k_version > 4 && len > 3 && tmp[len - 3] == '.' && + tmp[len - 2] == 'k' && tmp[len - 1] == 'o') { + len-=3; + tmp[len] = '\0'; + } + else +#endif if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') { len-=2; tmp[len] = '\0'; } + +#if defined(CONFIG_FEATURE_2_6_MODULES) + if (k_version > 4) + bb_xasprintf(&m_fullName, "%s.ko", tmp); + else +#else bb_xasprintf(&m_fullName, "%s.o", tmp); +#endif if (!m_name) { m_name = tmp; @@ -4125,28 +4148,26 @@ extern int insmod_main( int argc, char **argv) /* Get a filedesc for the module. Check we we have a complete path */ if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) || (fp = fopen(argv[optind], "r")) == NULL) { - struct utsname myuname; - /* Hmm. Could not open it. First search under /lib/modules/`uname -r`, * but do not error out yet if we fail to find it... */ - if (uname(&myuname) == 0) { - char *module_dir; - char *tmdn; + if (k_version) { /* uname succeedd */ + char *module_dir; + char *tmdn; char real_module_dir[FILENAME_MAX]; - tmdn = concat_path_file(_PATH_MODULES, myuname.release); + tmdn = concat_path_file(_PATH_MODULES, myuname.release); /* Jump through hoops in case /lib/modules/`uname -r` * is a symlink. We do not want recursive_action to * follow symlinks, but we do want to follow the * /lib/modules/`uname -r` dir, So resolve it ourselves * if it is a link... */ - if (realpath (tmdn, real_module_dir) == NULL) - module_dir = tmdn; - else - module_dir = real_module_dir; - recursive_action(module_dir, TRUE, FALSE, FALSE, - check_module_name_match, 0, m_fullName); - free(tmdn); + if (realpath (tmdn, real_module_dir) == NULL) + module_dir = tmdn; + else + module_dir = real_module_dir; + recursive_action(module_dir, TRUE, FALSE, FALSE, + check_module_name_match, 0, m_fullName); + free(tmdn); } /* Check if we have found anything yet */ @@ -4154,17 +4175,17 @@ extern int insmod_main( int argc, char **argv) { char module_dir[FILENAME_MAX]; - free(m_filename); - m_filename = 0; + free(m_filename); + m_filename = 0; if (realpath (_PATH_MODULES, module_dir) == NULL) strcpy(module_dir, _PATH_MODULES); /* No module found under /lib/modules/`uname -r`, this * time cast the net a bit wider. Search /lib/modules/ */ if (! recursive_action(module_dir, TRUE, FALSE, FALSE, - check_module_name_match, 0, m_fullName)) + check_module_name_match, 0, m_fullName)) { if (m_filename == 0 - || ((fp = fopen(m_filename, "r")) == NULL)) + || ((fp = fopen(m_filename, "r")) == NULL)) { bb_error_msg("%s: no module by that name found", m_fullName); goto out; @@ -4172,17 +4193,18 @@ extern int insmod_main( int argc, char **argv) } else bb_error_msg_and_die("%s: no module by that name found", m_fullName); } - } else + } else m_filename = bb_xstrdup(argv[optind]); printf("Using %s\n", m_filename); #ifdef CONFIG_FEATURE_2_6_MODULES - if (create_module(NULL, 0) < 0 && errno == ENOSYS) { + if (k_version > 4) + { optind--; - argv[optind] = m_filename; + argv[optind + 1] = m_filename; return insmod_ng_main(argc - optind, argv + optind); - } + } #endif if ((f = obj_load(fp, LOADBITS)) == NULL) @@ -4264,9 +4286,9 @@ extern int insmod_main( int argc, char **argv) /* Allocate common symbols, symbol tables, and string tables. */ - if (k_new_syscalls + if (k_new_syscalls ? !new_create_this_module(f, m_name) - : !old_create_mod_use_count(f)) + : !old_create_mod_use_count(f)) { goto out; } @@ -4282,8 +4304,8 @@ extern int insmod_main( int argc, char **argv) if (optind < argc) { if (m_has_modinfo - ? !new_process_module_arguments(f, argc - optind, argv + optind) - : !old_process_module_arguments(f, argc - optind, argv + optind)) + ? !new_process_module_arguments(f, argc - optind, argv + optind) + : !old_process_module_arguments(f, argc - optind, argv + optind)) { goto out; } @@ -4326,16 +4348,16 @@ extern int insmod_main( int argc, char **argv) delete_module(m_name); goto out; } -#endif +#endif if (!obj_relocate(f, m_addr)) { delete_module(m_name); goto out; } - if (k_new_syscalls + if (k_new_syscalls ? !new_init_module(m_name, f, m_size) - : !old_init_module(m_name, f, m_size)) + : !old_init_module(m_name, f, m_size)) { delete_module(m_name); goto out; diff --git a/modutils/modprobe.c b/modutils/modprobe.c index d48f36ed1..6b4405a44 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -57,6 +57,7 @@ struct mod_list_t { static struct dep_t *depend; static int autoclean, show_only, quiet, do_syslog, verbose; +static int k_version; int parse_tag_value ( char *buffer, char **ptag, char **pvalue ) { @@ -116,6 +117,7 @@ static struct dep_t *build_dep ( void ) char *filename = buffer; int continuation_line = 0; + k_version = 0; if ( uname ( &un )) return 0; @@ -123,6 +125,9 @@ static struct dep_t *build_dep ( void ) if ( bb_strlen ( un.release ) > ( sizeof( buffer ) - 64 )) { return 0; } + if (un.release[0] == '2') { + k_version = un.release[2] - '0'; + } strcpy ( filename, "/lib/modules/" ); strcat ( filename, un.release ); @@ -166,6 +171,12 @@ static struct dep_t *build_dep ( void ) else mods++; +#if defined(CONFIG_FEATURE_2_6_MODULES) + if ((k_version > 4) && ( *(col-3) == '.' ) && + ( *(col-2) == 'k' ) && ( *(col-1) == 'o' )) + ext = 3; + else +#endif if (( *(col-2) == '.' ) && ( *(col-1) == 'o' )) ext = 2; @@ -215,6 +226,12 @@ static struct dep_t *build_dep ( void ) else deps++; +#if defined(CONFIG_FEATURE_2_6_MODULES) + if ((k_version > 4) && ( *(end-2) == '.' ) && *(end-1) == 'k' && + ( *end == 'o' )) + ext = 3; + else +#endif if (( *(end-1) == '.' ) && ( *end == 'o' )) ext = 2; @@ -383,6 +400,13 @@ static void check_dep ( char *mod, struct mod_list_t **head, struct mod_list_t * // 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; -- 2.25.1