Per suggestion from Vladimir, eliminate check_wildcard_match(), which
authorEric Andersen <andersen@codepoet.org>
Mon, 14 May 2001 17:07:32 +0000 (17:07 -0000)
committerEric Andersen <andersen@codepoet.org>
Mon, 14 May 2001 17:07:32 +0000 (17:07 -0000)
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

Makefile
include/libbb.h
insmod.c
libbb/check_wildcard_match.c [deleted file]
libbb/libbb.h
modutils/insmod.c

index cbaf057049d480ee0838c459acc380a9b505f4a7..b35ffc72e9925d4b12d8b485c271901e0612a6df 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -236,7 +236,7 @@ endif
     
 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 \
index fde58b0a6a3e26f3574c478b88288a6c36875f56..02cf607a7f3f5785e68cd6ea553871515f0628ea 100644 (file)
@@ -127,7 +127,6 @@ extern void mtab_read(void);
 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);
index 27f4a50e2045123f0aa1ce7da403bea9385a8c42..bc7f6589acfacdfb6d6dcc010221d763b4508ee0 100644 (file)
--- a/insmod.c
+++ b/insmod.c
 #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
@@ -330,7 +330,7 @@ int delete_module(const char *);
 #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.  */
 
@@ -677,50 +677,35 @@ size_t nksyms;
 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);
 }
 
 
@@ -3125,7 +3110,7 @@ extern int insmod_main( int argc, char **argv)
        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
@@ -3152,7 +3137,7 @@ extern int insmod_main( int argc, char **argv)
                                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.
@@ -3186,24 +3171,42 @@ extern int insmod_main( int argc, char **argv)
        }
        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");
diff --git a/libbb/check_wildcard_match.c b/libbb/check_wildcard_match.c
deleted file mode 100644 (file)
index ab85679..0000000
+++ /dev/null
@@ -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:
-*/
index fde58b0a6a3e26f3574c478b88288a6c36875f56..02cf607a7f3f5785e68cd6ea553871515f0628ea 100644 (file)
@@ -127,7 +127,6 @@ extern void mtab_read(void);
 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);
index 27f4a50e2045123f0aa1ce7da403bea9385a8c42..bc7f6589acfacdfb6d6dcc010221d763b4508ee0 100644 (file)
 #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
@@ -330,7 +330,7 @@ int delete_module(const char *);
 #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.  */
 
@@ -677,50 +677,35 @@ size_t nksyms;
 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);
 }
 
 
@@ -3125,7 +3110,7 @@ extern int insmod_main( int argc, char **argv)
        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
@@ -3152,7 +3137,7 @@ extern int insmod_main( int argc, char **argv)
                                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.
@@ -3186,24 +3171,42 @@ extern int insmod_main( int argc, char **argv)
        }
        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");