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
LIBBB = libbb
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 \
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 \
extern char *mtab_first(void **iter);
extern char *mtab_next(void **iter);
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 pid_t* find_pid_by_name( char* pidName);
extern int find_real_root_device_name(char* name);
#ifndef MODUTILS_MODULE_H
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.
We do not use the kernel headers directly because we do not wish
#ifndef MODUTILS_OBJ_H
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. */
struct external_module *ext_modules;
int n_ext_modules;
int n_ext_modules_used;
-
-
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,
- void *userDate)
+static int check_module_name_match(const char *filename, struct stat *statbuf,
+ void *userdata)
{
- char *fullName = (char *) userDate;
-
+ char *fullname = (char *) userdata;
- if (fullName[0] == '\0')
+ if (fullname[0] == '\0')
return (FALSE);
else {
- char *tmp = strrchr((char *) fileName, '/');
-
- if (tmp == NULL)
- tmp = (char *) fileName;
- else
- tmp++;
- if (check_wildcard_match(tmp, fullName) == TRUE) {
+ char *tmp, *tmp1 = strdup(filename);
+ tmp = get_last_path_component(tmp1);
+ if (strcmp(tmp, fullname) == 0) {
+ free(tmp1);
/* Stop searching if we find a match */
- safe_strncpy(m_filename, fileName, sizeof(m_filename));
- return (FALSE);
+ safe_strncpy(m_filename, filename, sizeof(m_filename));
+ return (TRUE);
}
+ free(tmp1);
}
- return (TRUE);
+ return (FALSE);
}
FILE *fp;
struct obj_file *f;
struct stat st;
- char m_name[BUFSIZ + 1] = "\0";
+ char m_name[FILENAME_MAX + 1] = "\0";
int exit_status = EXIT_FAILURE;
int m_has_modinfo;
#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
flag_export = 0;
break;
case 'o': /* name the output module */
- strncpy(m_name, optarg, BUFSIZ);
+ strncpy(m_name, optarg, FILENAME_MAX);
break;
case 'L': /* Stub warning */
/* This is needed for compatibility with modprobe.
}
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) ||
(fp = fopen(argv[optind], "r")) == NULL) {
- /* Hmpf. Could not open it. Search through _PATH_MODULES to find a module named m_name */
- if (recursive_action(_PATH_MODULES, TRUE, FALSE, FALSE,
- findNamedModule, 0, m_fullName) == FALSE)
+ 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))
{
- 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,
+ check_module_name_match, 0, m_fullName) == FALSE)
{
- error_msg("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES);
- return EXIT_FAILURE;
- }
- } else
- error_msg_and_die("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES);
- } else
+ if (m_filename[0] == '\0'
+ || ((fp = fopen(m_filename, "r")) == NULL))
+ {
+ error_msg("%s: no module by that name found", m_fullName);
+ return EXIT_FAILURE;
+ }
+ } else
+ error_msg_and_die("%s: no module by that name found", m_fullName);
+ }
+ } else
safe_strncpy(m_filename, argv[optind], sizeof(m_filename));
+ printf("Using %s\n", m_filename);
if ((f = obj_load(fp)) == NULL)
perror_msg_and_die("Could not load the module");
+++ /dev/null
-/* 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:
-*/
extern char *mtab_first(void **iter);
extern char *mtab_next(void **iter);
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 pid_t* find_pid_by_name( char* pidName);
extern int find_real_root_device_name(char* name);
#ifndef MODUTILS_MODULE_H
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.
We do not use the kernel headers directly because we do not wish
#ifndef MODUTILS_OBJ_H
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. */
struct external_module *ext_modules;
int n_ext_modules;
int n_ext_modules_used;
-
-
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,
- void *userDate)
+static int check_module_name_match(const char *filename, struct stat *statbuf,
+ void *userdata)
{
- char *fullName = (char *) userDate;
-
+ char *fullname = (char *) userdata;
- if (fullName[0] == '\0')
+ if (fullname[0] == '\0')
return (FALSE);
else {
- char *tmp = strrchr((char *) fileName, '/');
-
- if (tmp == NULL)
- tmp = (char *) fileName;
- else
- tmp++;
- if (check_wildcard_match(tmp, fullName) == TRUE) {
+ char *tmp, *tmp1 = strdup(filename);
+ tmp = get_last_path_component(tmp1);
+ if (strcmp(tmp, fullname) == 0) {
+ free(tmp1);
/* Stop searching if we find a match */
- safe_strncpy(m_filename, fileName, sizeof(m_filename));
- return (FALSE);
+ safe_strncpy(m_filename, filename, sizeof(m_filename));
+ return (TRUE);
}
+ free(tmp1);
}
- return (TRUE);
+ return (FALSE);
}
FILE *fp;
struct obj_file *f;
struct stat st;
- char m_name[BUFSIZ + 1] = "\0";
+ char m_name[FILENAME_MAX + 1] = "\0";
int exit_status = EXIT_FAILURE;
int m_has_modinfo;
#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
flag_export = 0;
break;
case 'o': /* name the output module */
- strncpy(m_name, optarg, BUFSIZ);
+ strncpy(m_name, optarg, FILENAME_MAX);
break;
case 'L': /* Stub warning */
/* This is needed for compatibility with modprobe.
}
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) ||
(fp = fopen(argv[optind], "r")) == NULL) {
- /* Hmpf. Could not open it. Search through _PATH_MODULES to find a module named m_name */
- if (recursive_action(_PATH_MODULES, TRUE, FALSE, FALSE,
- findNamedModule, 0, m_fullName) == FALSE)
+ 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))
{
- 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,
+ check_module_name_match, 0, m_fullName) == FALSE)
{
- error_msg("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES);
- return EXIT_FAILURE;
- }
- } else
- error_msg_and_die("No module named '%s' found in '%s'", m_fullName, _PATH_MODULES);
- } else
+ if (m_filename[0] == '\0'
+ || ((fp = fopen(m_filename, "r")) == NULL))
+ {
+ error_msg("%s: no module by that name found", m_fullName);
+ return EXIT_FAILURE;
+ }
+ } else
+ error_msg_and_die("%s: no module by that name found", m_fullName);
+ }
+ } else
safe_strncpy(m_filename, argv[optind], sizeof(m_filename));
+ printf("Using %s\n", m_filename);
if ((f = obj_load(fp)) == NULL)
perror_msg_and_die("Could not load the module");