[BusyBox-cvs] busybox/modutils insmod.c, 1.107, 1.108 modprobe.c, 1.23, 1.24
Erik Andersen
andersen at busybox.net
Fri Dec 19 21:04:22 UTC 2003
Update of /var/cvs/busybox/modutils
In directory nail:/tmp/cvs-serv25736/modutils
Modified Files:
insmod.c modprobe.c
Log Message:
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
Index: modprobe.c
===================================================================
RCS file: /var/cvs/busybox/modutils/modprobe.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- modprobe.c 14 Nov 2003 02:49:19 -0000 1.23
+++ modprobe.c 19 Dec 2003 21:04:19 -0000 1.24
@@ -57,6 +57,7 @@
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 @@
char *filename = buffer;
int continuation_line = 0;
+ k_version = 0;
if ( uname ( &un ))
return 0;
@@ -123,6 +125,9 @@
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 @@
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 @@
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 @@
// 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;
Index: insmod.c
===================================================================
RCS file: /var/cvs/busybox/modutils/insmod.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -d -r1.107 -r1.108
--- insmod.c 11 Dec 2003 01:42:13 -0000 1.107
+++ insmod.c 19 Dec 2003 21:04:19 -0000 1.108
@@ -4050,6 +4050,8 @@
#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 @@
bb_show_usage();
}
}
-
+
if (argv[optind] == NULL) {
bb_show_usage();
}
@@ -4108,12 +4110,33 @@
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 @@
/* 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 @@
{
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 @@
} 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 @@
/* 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 @@
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 @@
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;
More information about the busybox-cvs
mailing list