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:
parent
cb378a5267
commit
14d354312a
2
Makefile
2
Makefile
@ -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 \
|
||||||
|
@ -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);
|
||||||
|
81
insmod.c
81
insmod.c
@ -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");
|
||||||
|
@ -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:
|
|
||||||
*/
|
|
@ -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);
|
||||||
|
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user