Per suggestion from Vladimir, eliminate check_wildcard_match(), which

was only being used by insmod these days.

Also, I spent a minute adjusting insmod so that it first searches
/lib/modules/`uname -r` and then (if that fails) searches /lib/modules,
which makes bb insmod behave much more like the real insmod, and should
avoid nasty surprises (such as the recent "Modutils vs. Busybox..."
thread).
 -Erik
This commit is contained in:
Eric Andersen 2001-05-14 17:07:32 +00:00
parent cb378a5267
commit 14d354312a
6 changed files with 97 additions and 234 deletions

View File

@ -236,7 +236,7 @@ endif
LIBBB = libbb LIBBB = libbb
LIBBB_LIB = libbb.a LIBBB_LIB = libbb.a
LIBBB_CSRC= ask_confirmation.c check_wildcard_match.c chomp.c \ LIBBB_CSRC= ask_confirmation.c chomp.c \
concat_path_file.c copy_file.c copy_file_chunk.c create_path.c \ concat_path_file.c copy_file.c copy_file_chunk.c create_path.c \
daemon.c deb_extract.c device_open.c error_msg.c error_msg_and_die.c \ daemon.c deb_extract.c device_open.c error_msg.c error_msg_and_die.c \
find_mount_point.c find_pid_by_name.c find_root_device.c full_read.c \ find_mount_point.c find_pid_by_name.c find_root_device.c full_read.c \

View File

@ -127,7 +127,6 @@ extern void mtab_read(void);
extern char *mtab_first(void **iter); extern char *mtab_first(void **iter);
extern char *mtab_next(void **iter); extern char *mtab_next(void **iter);
extern char *mtab_getinfo(const char *match, const char which); extern char *mtab_getinfo(const char *match, const char which);
extern int check_wildcard_match(const char* text, const char* pattern);
extern long atoi_w_units (const char *cp); extern long atoi_w_units (const char *cp);
extern pid_t* find_pid_by_name( char* pidName); extern pid_t* find_pid_by_name( char* pidName);
extern int find_real_root_device_name(char* name); extern int find_real_root_device_name(char* name);

View File

@ -124,7 +124,7 @@
#ifndef MODUTILS_MODULE_H #ifndef MODUTILS_MODULE_H
static const int MODUTILS_MODULE_H = 1; static const int MODUTILS_MODULE_H = 1;
#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $" #ident "$Id: insmod.c,v 1.61 2001/05/14 17:07:32 andersen Exp $"
/* This file contains the structures used by the 2.0 and 2.1 kernels. /* 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 We do not use the kernel headers directly because we do not wish
@ -330,7 +330,7 @@ int delete_module(const char *);
#ifndef MODUTILS_OBJ_H #ifndef MODUTILS_OBJ_H
static const int MODUTILS_OBJ_H = 1; static const int MODUTILS_OBJ_H = 1;
#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $" #ident "$Id: insmod.c,v 1.61 2001/05/14 17:07:32 andersen Exp $"
/* The relocatable object is manipulated using elfin types. */ /* The relocatable object is manipulated using elfin types. */
@ -677,50 +677,35 @@ size_t nksyms;
struct external_module *ext_modules; struct external_module *ext_modules;
int n_ext_modules; int n_ext_modules;
int n_ext_modules_used; int n_ext_modules_used;
extern int delete_module(const char *); extern int delete_module(const char *);
static char m_filename[FILENAME_MAX + 1];
static char m_fullName[FILENAME_MAX + 1];
/* This is kind of troublesome. See, we don't actually support
the m68k or the arm the same way we support i386 and (now)
sh. In doing my SH patch, I just assumed that whatever works
for i386 also works for m68k and arm since currently insmod.c
does nothing special for them. If this isn't true, the below
line is rather misleading IMHO, and someone should either
change it or add more proper architecture-dependent support
for these boys.
-- Bryan Rittmeyer <bryan@ixiacom.com> */
static char m_filename[BUFSIZ + 1];
static char m_fullName[BUFSIZ + 1];
/*======================================================================*/ /*======================================================================*/
static int findNamedModule(const char *fileName, struct stat *statbuf, static int check_module_name_match(const char *filename, struct stat *statbuf,
void *userDate) void *userdata)
{ {
char *fullName = (char *) userDate; char *fullname = (char *) userdata;
if (fullname[0] == '\0')
if (fullName[0] == '\0')
return (FALSE); return (FALSE);
else { else {
char *tmp = strrchr((char *) fileName, '/'); char *tmp, *tmp1 = strdup(filename);
tmp = get_last_path_component(tmp1);
if (tmp == NULL) if (strcmp(tmp, fullname) == 0) {
tmp = (char *) fileName; free(tmp1);
else
tmp++;
if (check_wildcard_match(tmp, fullName) == TRUE) {
/* Stop searching if we find a match */ /* Stop searching if we find a match */
safe_strncpy(m_filename, fileName, sizeof(m_filename)); safe_strncpy(m_filename, filename, sizeof(m_filename));
return (FALSE);
}
}
return (TRUE); return (TRUE);
}
free(tmp1);
}
return (FALSE);
} }
@ -3125,7 +3110,7 @@ extern int insmod_main( int argc, char **argv)
FILE *fp; FILE *fp;
struct obj_file *f; struct obj_file *f;
struct stat st; struct stat st;
char m_name[BUFSIZ + 1] = "\0"; char m_name[FILENAME_MAX + 1] = "\0";
int exit_status = EXIT_FAILURE; int exit_status = EXIT_FAILURE;
int m_has_modinfo; int m_has_modinfo;
#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
@ -3152,7 +3137,7 @@ extern int insmod_main( int argc, char **argv)
flag_export = 0; flag_export = 0;
break; break;
case 'o': /* name the output module */ case 'o': /* name the output module */
strncpy(m_name, optarg, BUFSIZ); strncpy(m_name, optarg, FILENAME_MAX);
break; break;
case 'L': /* Stub warning */ case 'L': /* Stub warning */
/* This is needed for compatibility with modprobe. /* This is needed for compatibility with modprobe.
@ -3186,24 +3171,42 @@ extern int insmod_main( int argc, char **argv)
} }
strcat(m_fullName, ".o"); strcat(m_fullName, ".o");
/* Get a filedesc for the module */ /* Get a filedesc for the module. Check we we have a complete path */
if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) || if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) ||
(fp = fopen(argv[optind], "r")) == NULL) { (fp = fopen(argv[optind], "r")) == NULL) {
/* Hmpf. Could not open it. Search through _PATH_MODULES to find a module named m_name */ 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[FILENAME_MAX];
snprintf (module_dir, sizeof(module_dir), "%s/%s",
_PATH_MODULES, myuname.release);
recursive_action(module_dir, TRUE, FALSE, FALSE,
check_module_name_match, 0, m_fullName);
}
/* Check if we have found anything yet */
if (m_filename[0] == '\0' || ((fp = fopen(m_filename, "r")) == NULL))
{
/* No module found under /lib/modules/`uname -r`, this
* time cast the net a bit wider. Search /lib/modules/ */
if (recursive_action(_PATH_MODULES, TRUE, FALSE, FALSE, if (recursive_action(_PATH_MODULES, TRUE, FALSE, FALSE,
findNamedModule, 0, m_fullName) == FALSE) check_module_name_match, 0, m_fullName) == FALSE)
{ {
if (m_filename[0] == '\0' if (m_filename[0] == '\0'
|| ((fp = fopen(m_filename, "r")) == NULL)) || ((fp = fopen(m_filename, "r")) == NULL))
{ {
error_msg("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES); error_msg("%s: no module by that name found", m_fullName);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} else } else
error_msg_and_die("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES); error_msg_and_die("%s: no module by that name found", m_fullName);
}
} else } else
safe_strncpy(m_filename, argv[optind], sizeof(m_filename)); safe_strncpy(m_filename, argv[optind], sizeof(m_filename));
printf("Using %s\n", m_filename);
if ((f = obj_load(fp)) == NULL) if ((f = obj_load(fp)) == NULL)
perror_msg_and_die("Could not load the module"); perror_msg_and_die("Could not load the module");

View File

@ -1,141 +0,0 @@
/* vi: set sw=4 ts=4: */
/*
* Utility routines.
*
* Copyright (C) tons of folks. Tracking down who wrote what
* isn't something I'm going to worry about... If you wrote something
* here, please feel free to acknowledge your work.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Based in part on code from sash, Copyright (c) 1999 by David I. Bell
* Permission has been granted to redistribute this code under the GPL.
*
*/
#include <stdio.h>
#include <string.h>
#include "libbb.h"
/*
* Routine to see if a text string is matched by a wildcard pattern.
* Returns TRUE if the text is matched, or FALSE if it is not matched
* or if the pattern is invalid.
* * matches zero or more characters
* ? matches a single character
* [abc] matches 'a', 'b' or 'c'
* \c quotes character c
* Adapted from code written by Ingo Wilken, and
* then taken from sash, Copyright (c) 1999 by David I. Bell
* Permission is granted to use, distribute, or modify this source,
* provided that this copyright notice remains intact.
* Permission to distribute this code under the GPL has been granted.
*/
extern int check_wildcard_match(const char *text, const char *pattern)
{
const char *retryPat;
const char *retryText;
int ch;
int found;
int len;
retryPat = NULL;
retryText = NULL;
while (*text || *pattern) {
ch = *pattern++;
switch (ch) {
case '*':
retryPat = pattern;
retryText = text;
break;
case '[':
found = FALSE;
while ((ch = *pattern++) != ']') {
if (ch == '\\')
ch = *pattern++;
if (ch == '\0')
return FALSE;
if (*text == ch)
found = TRUE;
}
len=strlen(text);
if (found == FALSE && len!=0) {
return FALSE;
}
if (found == TRUE) {
if (strlen(pattern)==0 && len==1) {
return TRUE;
}
if (len!=0) {
text++;
continue;
}
}
/* fall into next case */
case '?':
if (*text++ == '\0')
return FALSE;
break;
case '\\':
ch = *pattern++;
if (ch == '\0')
return FALSE;
/* fall into next case */
default:
if (*text == ch) {
if (*text)
text++;
break;
}
if (*text) {
pattern = retryPat;
text = ++retryText;
break;
}
return FALSE;
}
if (pattern == NULL)
return FALSE;
}
return TRUE;
}
/* END CODE */
/*
Local Variables:
c-file-style: "linux"
c-basic-offset: 4
tab-width: 4
End:
*/

View File

@ -127,7 +127,6 @@ extern void mtab_read(void);
extern char *mtab_first(void **iter); extern char *mtab_first(void **iter);
extern char *mtab_next(void **iter); extern char *mtab_next(void **iter);
extern char *mtab_getinfo(const char *match, const char which); extern char *mtab_getinfo(const char *match, const char which);
extern int check_wildcard_match(const char* text, const char* pattern);
extern long atoi_w_units (const char *cp); extern long atoi_w_units (const char *cp);
extern pid_t* find_pid_by_name( char* pidName); extern pid_t* find_pid_by_name( char* pidName);
extern int find_real_root_device_name(char* name); extern int find_real_root_device_name(char* name);

View File

@ -124,7 +124,7 @@
#ifndef MODUTILS_MODULE_H #ifndef MODUTILS_MODULE_H
static const int MODUTILS_MODULE_H = 1; static const int MODUTILS_MODULE_H = 1;
#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $" #ident "$Id: insmod.c,v 1.61 2001/05/14 17:07:32 andersen Exp $"
/* This file contains the structures used by the 2.0 and 2.1 kernels. /* 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 We do not use the kernel headers directly because we do not wish
@ -330,7 +330,7 @@ int delete_module(const char *);
#ifndef MODUTILS_OBJ_H #ifndef MODUTILS_OBJ_H
static const int MODUTILS_OBJ_H = 1; static const int MODUTILS_OBJ_H = 1;
#ident "$Id: insmod.c,v 1.60 2001/04/26 19:29:58 andersen Exp $" #ident "$Id: insmod.c,v 1.61 2001/05/14 17:07:32 andersen Exp $"
/* The relocatable object is manipulated using elfin types. */ /* The relocatable object is manipulated using elfin types. */
@ -677,50 +677,35 @@ size_t nksyms;
struct external_module *ext_modules; struct external_module *ext_modules;
int n_ext_modules; int n_ext_modules;
int n_ext_modules_used; int n_ext_modules_used;
extern int delete_module(const char *); extern int delete_module(const char *);
static char m_filename[FILENAME_MAX + 1];
static char m_fullName[FILENAME_MAX + 1];
/* This is kind of troublesome. See, we don't actually support
the m68k or the arm the same way we support i386 and (now)
sh. In doing my SH patch, I just assumed that whatever works
for i386 also works for m68k and arm since currently insmod.c
does nothing special for them. If this isn't true, the below
line is rather misleading IMHO, and someone should either
change it or add more proper architecture-dependent support
for these boys.
-- Bryan Rittmeyer <bryan@ixiacom.com> */
static char m_filename[BUFSIZ + 1];
static char m_fullName[BUFSIZ + 1];
/*======================================================================*/ /*======================================================================*/
static int findNamedModule(const char *fileName, struct stat *statbuf, static int check_module_name_match(const char *filename, struct stat *statbuf,
void *userDate) void *userdata)
{ {
char *fullName = (char *) userDate; char *fullname = (char *) userdata;
if (fullname[0] == '\0')
if (fullName[0] == '\0')
return (FALSE); return (FALSE);
else { else {
char *tmp = strrchr((char *) fileName, '/'); char *tmp, *tmp1 = strdup(filename);
tmp = get_last_path_component(tmp1);
if (tmp == NULL) if (strcmp(tmp, fullname) == 0) {
tmp = (char *) fileName; free(tmp1);
else
tmp++;
if (check_wildcard_match(tmp, fullName) == TRUE) {
/* Stop searching if we find a match */ /* Stop searching if we find a match */
safe_strncpy(m_filename, fileName, sizeof(m_filename)); safe_strncpy(m_filename, filename, sizeof(m_filename));
return (FALSE);
}
}
return (TRUE); return (TRUE);
}
free(tmp1);
}
return (FALSE);
} }
@ -3125,7 +3110,7 @@ extern int insmod_main( int argc, char **argv)
FILE *fp; FILE *fp;
struct obj_file *f; struct obj_file *f;
struct stat st; struct stat st;
char m_name[BUFSIZ + 1] = "\0"; char m_name[FILENAME_MAX + 1] = "\0";
int exit_status = EXIT_FAILURE; int exit_status = EXIT_FAILURE;
int m_has_modinfo; int m_has_modinfo;
#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
@ -3152,7 +3137,7 @@ extern int insmod_main( int argc, char **argv)
flag_export = 0; flag_export = 0;
break; break;
case 'o': /* name the output module */ case 'o': /* name the output module */
strncpy(m_name, optarg, BUFSIZ); strncpy(m_name, optarg, FILENAME_MAX);
break; break;
case 'L': /* Stub warning */ case 'L': /* Stub warning */
/* This is needed for compatibility with modprobe. /* This is needed for compatibility with modprobe.
@ -3186,24 +3171,42 @@ extern int insmod_main( int argc, char **argv)
} }
strcat(m_fullName, ".o"); strcat(m_fullName, ".o");
/* Get a filedesc for the module */ /* Get a filedesc for the module. Check we we have a complete path */
if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) || if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) ||
(fp = fopen(argv[optind], "r")) == NULL) { (fp = fopen(argv[optind], "r")) == NULL) {
/* Hmpf. Could not open it. Search through _PATH_MODULES to find a module named m_name */ 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[FILENAME_MAX];
snprintf (module_dir, sizeof(module_dir), "%s/%s",
_PATH_MODULES, myuname.release);
recursive_action(module_dir, TRUE, FALSE, FALSE,
check_module_name_match, 0, m_fullName);
}
/* Check if we have found anything yet */
if (m_filename[0] == '\0' || ((fp = fopen(m_filename, "r")) == NULL))
{
/* No module found under /lib/modules/`uname -r`, this
* time cast the net a bit wider. Search /lib/modules/ */
if (recursive_action(_PATH_MODULES, TRUE, FALSE, FALSE, if (recursive_action(_PATH_MODULES, TRUE, FALSE, FALSE,
findNamedModule, 0, m_fullName) == FALSE) check_module_name_match, 0, m_fullName) == FALSE)
{ {
if (m_filename[0] == '\0' if (m_filename[0] == '\0'
|| ((fp = fopen(m_filename, "r")) == NULL)) || ((fp = fopen(m_filename, "r")) == NULL))
{ {
error_msg("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES); error_msg("%s: no module by that name found", m_fullName);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} else } else
error_msg_and_die("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES); error_msg_and_die("%s: no module by that name found", m_fullName);
}
} else } else
safe_strncpy(m_filename, argv[optind], sizeof(m_filename)); safe_strncpy(m_filename, argv[optind], sizeof(m_filename));
printf("Using %s\n", m_filename);
if ((f = obj_load(fp)) == NULL) if ((f = obj_load(fp)) == NULL)
perror_msg_and_die("Could not load the module"); perror_msg_and_die("Could not load the module");