ar71xx: register RTL8366RB switch on the TL-WR1043NB board
[openwrt.git] / package / busybox / patches / 470-insmod_search.patch
index ef372ec..022ca24 100644 (file)
@@ -1,39 +1,19 @@
-Index: busybox-1.8.1/modutils/insmod.c
-===================================================================
---- busybox-1.8.1.orig/modutils/insmod.c       2007-11-10 02:40:49.000000000 +0100
-+++ busybox-1.8.1/modutils/insmod.c    2007-11-10 17:28:44.391223047 +0100
-@@ -61,21 +61,117 @@
+--- a/modutils/insmod.c
++++ b/modutils/insmod.c
+@@ -9,6 +9,99 @@
  #include "libbb.h"
- #include <libgen.h>
- #include <sys/utsname.h>
-+#if ENABLE_FEATURE_2_6_MODULES
+ #include "modutils.h"
++#include <sys/utsname.h>
++#ifndef CONFIG_FEATURE_2_4_MODULES
 +#include <sys/mman.h>
 +#include <asm/unistd.h>
 +#include <sys/syscall.h>
 +#endif
- #if !ENABLE_FEATURE_2_4_MODULES && !ENABLE_FEATURE_2_6_MODULES
- #undef ENABLE_FEATURE_2_4_MODULES
- #define ENABLE_FEATURE_2_4_MODULES 1
- #endif
--/*
-- * Big piece of 2.4-specific code
-- */
- #if ENABLE_FEATURE_2_4_MODULES
--
-+int insmod_main_24(int argc, char **argv);
-+#endif
- #if ENABLE_FEATURE_2_6_MODULES
--static int insmod_ng_main(int argc, char **argv);
-+int insmod_main_26(int argc, char **argv);
-+#endif
-+int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 +
 +static char *g_filename = NULL;
-+#define _PATH_MODULES "/lib/modules"
 +
-+static int check_module_name_match(const char *filename, struct stat *statbuf,
++static int FAST_FUNC check_module_name_match(const char *filename, struct stat *statbuf,
 +                                 void *userdata, int depth)
 +{
 +      char *fullname = (char *) userdata;
@@ -69,7 +49,7 @@ Index: busybox-1.8.1/modutils/insmod.c
 +      if (k_version <= 4)
 +              suffix = ".o";
 +      else
- #endif
++#endif
 +              suffix = ".ko";
 +
 +      len = strlen(filename);
@@ -94,7 +74,7 @@ Index: busybox-1.8.1/modutils/insmod.c
 +      * follow symlinks, but we do want to follow the
 +      * /lib/modules/`uname -r` dir, So resolve it ourselves
 +      * if it is a link... */
-+      module_dir = concat_path_file(_PATH_MODULES, myuname.release);
++      module_dir = concat_path_file(CONFIG_DEFAULT_MODULES_DIR, myuname.release);
 +      if (realpath(module_dir, real_module_dir) != NULL) {
 +              free(module_dir);
 +              module_dir = real_module_dir;
@@ -111,378 +91,40 @@ Index: busybox-1.8.1/modutils/insmod.c
 +              ret = 0;
 +      else
 +              free(g_filename);
++
 +done:
 +      free(filename);
 +
 +      return ret;
 +}
-+
-+/*
-+ * Big piece of 2.4-specific code
-+ */
-+#if ENABLE_FEATURE_2_4_MODULES
- #if ENABLE_FEATURE_INSMOD_LOADINKMEM
- #define LOADBITS 0
- #else
-@@ -673,7 +769,6 @@
- #endif
--#define _PATH_MODULES "/lib/modules"
- enum { STRVERSIONLEN = 64 };
- /*======================================================================*/
-@@ -789,27 +884,6 @@
- static char *m_fullName;
--/*======================================================================*/
--
--
--static int check_module_name_match(const char *filename, struct stat *statbuf,
--                              void *userdata, int depth)
--{
--      char *fullname = (char *) userdata;
--      char *tmp;
--
--      if (fullname[0] == '\0')
--              return FALSE;
--
--      tmp = bb_get_last_path_component_nostrip(filename);
--      if (strcmp(tmp, fullname) == 0) {
--              /* Stop searching if we find a match */
--              m_filename = xstrdup(filename);
--              return FALSE;
--      }
--      return TRUE;
--}
--
- /*======================================================================*/
-@@ -3897,145 +3971,57 @@
- void print_load_map(struct obj_file *f);
- #endif
--int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
--int insmod_main(int argc, char **argv)
-+int insmod_main_24( int argc, char **argv)
- {
-       char *opt_o, *arg1;
--      int len;
-       int k_crcs;
--      char *tmp, *tmp1;
-       unsigned long m_size;
-       ElfW(Addr) m_addr;
-       struct obj_file *f;
--      struct stat st;
--      char *m_name = NULL;
--      int exit_status = EXIT_FAILURE;
-+      char *tmp = NULL, *m_name = NULL;
-+      int ret = EINVAL;
-       int m_has_modinfo;
- #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
-       struct utsname uts_info;
-       char m_strversion[STRVERSIONLEN];
-       int m_version, m_crcs;
- #endif
--#if ENABLE_FEATURE_CLEAN_UP
-       FILE *fp = NULL;
--#else
--      FILE *fp;
--#endif
--      int k_version = 0;
-+      int k_version;
-       struct utsname myuname;
-+      /* check the kernel version */
-+      if ((uname(&myuname) != 0) || (myuname.release[0] != '2'))
-+              return EINVAL;
-+
-+      k_version = myuname.release[2] - '0';
-+      if (k_version > 4)
-+              return ENOTSUP;
-+
-       /* Parse any options */
-       getopt32(argv, OPTION_STR, &opt_o);
-       arg1 = argv[optind];
-       if (option_mask32 & OPT_o) { // -o /* name the output module */
--              free(m_name);
-               m_name = xstrdup(opt_o);
-       }
--      if (arg1 == NULL) {
-+      if (arg1 == NULL)
-               bb_show_usage();
--      }
--
--      /* Grab the module name */
--      tmp1 = xstrdup(arg1);
--      tmp = basename(tmp1);
--      len = strlen(tmp);
--
--      if (uname(&myuname) == 0) {
--              if (myuname.release[0] == '2') {
--                      k_version = myuname.release[2] - '0';
--              }
--      }
--
--#if ENABLE_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 ENABLE_FEATURE_2_6_MODULES
--      if (k_version > 4)
--              m_fullName = xasprintf("%s.ko", tmp);
--      else
--#endif
--              m_fullName = xasprintf("%s.o", tmp);
-+      ret = find_module(arg1);
-+      if (ret)
-+              goto out;
-       if (!m_name) {
--              m_name = tmp;
--      } else {
--              free(tmp1);
--              tmp1 = NULL;       /* flag for free(m_name) before exit() */
-+              tmp = xstrdup(arg1);
-+              m_name = basename(tmp);
-       }
--      /* Get a filedesc for the module.  Check that we have a complete path */
--      if (stat(arg1, &st) < 0 || !S_ISREG(st.st_mode)
--       || (fp = fopen(arg1, "r")) == NULL
--      ) {
--              /* 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 (k_version) {        /* uname succeedd */
--                      char *module_dir;
--                      char *tmdn;
--
--                      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... */
--                      module_dir = xmalloc_readlink(tmdn);
--                      if (!module_dir)
--                              module_dir = xstrdup(tmdn);
--                      recursive_action(module_dir, ACTION_RECURSE,
--                                      check_module_name_match, NULL, m_fullName, 0);
--                      free(module_dir);
--                      free(tmdn);
--              }
--
--              /* Check if we have found anything yet */
--              if (!m_filename || ((fp = fopen(m_filename, "r")) == NULL)) {
--                      int r;
--                      char *module_dir;
--
--                      free(m_filename);
--                      m_filename = NULL;
--                      module_dir = xmalloc_readlink(_PATH_MODULES);
--                      if (!module_dir)
--                              module_dir = xstrdup(_PATH_MODULES);
--                      /* No module found under /lib/modules/`uname -r`, this
--                       * time cast the net a bit wider.  Search /lib/modules/ */
--                      r = recursive_action(module_dir, ACTION_RECURSE,
--                                      check_module_name_match, NULL, m_fullName, 0);
--                      if (r)
--                              bb_error_msg_and_die("%s: module not found", m_fullName);
--                      free(module_dir);
--                      if (m_filename == NULL
--                       || ((fp = fopen(m_filename, "r")) == NULL)
--                      ) {
--                              bb_error_msg_and_die("%s: module not found", m_fullName);
--                      }
--              }
--      } else
--              m_filename = xstrdup(arg1);
--
--      if (flag_verbose)
--              printf("Using %s\n", m_filename);
--
--#if ENABLE_FEATURE_2_6_MODULES
--      if (k_version > 4) {
--              argv[optind] = m_filename;
--              optind--;
--              return insmod_ng_main(argc - optind, argv + optind);
-+      fp = fopen(g_filename, "r");
-+      if (!fp) {
-+              ret = errno;
-+              goto out;
-       }
--#endif
-       f = obj_load(fp, LOADBITS);
-@@ -4062,7 +4048,7 @@
-                               "\t%s was compiled for kernel version %s\n"
-                               "\twhile this kernel is version %s",
-                               flag_force_load ? "warning: " : "",
--                              m_filename, m_strversion, uts_info.release);
-+                              g_filename, m_strversion, uts_info.release);
-                       if (!flag_force_load)
-                               goto out;
-               }
-@@ -4104,7 +4090,7 @@
-       hide_special_symbols(f);
- #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
--      add_ksymoops_symbols(f, m_filename, m_name);
-+      add_ksymoops_symbols(f, g_filename, m_name);
- #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
-       new_create_module_ksymtab(f);
-@@ -4147,18 +4133,19 @@
-       if (flag_print_load_map)
-               print_load_map(f);
  
--      exit_status = EXIT_SUCCESS;
-+      ret = EXIT_SUCCESS;
-  out:
- #if ENABLE_FEATURE_CLEAN_UP
-       if (fp)
-               fclose(fp);
--      free(tmp1);
--      if (!tmp1)
-+      if (tmp)
-+              free(tmp);
-+      else if (m_name)
-               free(m_name);
--      free(m_filename);
-+      free(g_filename);
- #endif
--      return exit_status;
-+      return ret;
- }
- #endif /* ENABLE_FEATURE_2_4_MODULES */
-@@ -4190,23 +4177,32 @@
-       }
- }
--#if !ENABLE_FEATURE_2_4_MODULES
--int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
--int insmod_main(int argc, char **argv)
--#else
--static int insmod_ng_main(int argc, char **argv)
--#endif
-+int insmod_main_26(int argc, char **argv)
- {
--      long ret;
--      size_t len;
-+      char *filename, *options;
-+      struct utsname myuname;
-+      int k_version;
-       int optlen;
-+      size_t len;
-       void *map;
--      char *filename, *options;
-+      long ret = 0;
-+
-+      /* check the kernel version */
-+      if ((uname(&myuname) != 0) || (myuname.release[0] != '2'))
-+              return EINVAL;
-+
-+      k_version = myuname.release[2] - '0';
-+      if (k_version <= 4)
-+              return ENOTSUP;
-       filename = *++argv;
+ int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int insmod_main(int argc UNUSED_PARAM, char **argv)
+@@ -33,9 +126,15 @@ int insmod_main(int argc UNUSED_PARAM, c
        if (!filename)
                bb_show_usage();
  
-+      ret = find_module(filename);
-+      if (ret || (g_filename == NULL))
-+              goto done;
+-      rc = bb_init_module(filename, parse_cmdline_module_options(argv));
++      rc = find_module(filename);
++      if (rc || (g_filename == NULL))
++                      goto done;
 +
-       /* Rest is options */
-       options = xzalloc(1);
-       optlen = 0;
-@@ -4216,36 +4212,47 @@
-               optlen += sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv);
-       }
++      rc = bb_init_module(g_filename, parse_cmdline_module_options(argv));
+       if (rc)
+               bb_error_msg("can't insert '%s': %s", filename, moderror(rc));
++      free (g_filename);
  
--#if 0
--      /* Any special reason why mmap? It isn't performace critical... */
--      int fd;
--      struct stat st;
--      unsigned long len;
--      fd = xopen(filename, O_RDONLY);
--      fstat(fd, &st);
--      len = st.st_size;
--      map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
--      if (map == MAP_FAILED) {
--              bb_perror_msg_and_die("cannot mmap '%s'", filename);
--      }
--
--      /* map == NULL on Blackfin, probably on other MMU-less systems too. Workaround. */
--      if (map == NULL) {
--              map = xmalloc(len);
--              xread(fd, map, len);
--      }
--#else
-       len = MAXINT(ssize_t);
--      map = xmalloc_open_read_close(filename, &len);
--#endif
--
-+      map = xmalloc_open_read_close(g_filename, &len);
-       ret = syscall(__NR_init_module, map, len, options);
-       if (ret != 0) {
-               bb_perror_msg_and_die("cannot insert '%s': %s (%li)",
--                              filename, moderror(errno), ret);
-+                              g_filename, moderror(errno), ret);
-       }
 +done:
-+      if (g_filename && (g_filename != filename))
-+              free(g_filename);
--      return 0;
-+      return ret;
+       return rc;
  }
- #endif
-+
-+int insmod_main(int argc, char **argv)
-+{
-+      int ret;
-+
-+      g_filename = NULL;
-+#if ENABLE_FEATURE_2_6_MODULES
-+      ret = insmod_main_26(argc, argv);
-+      if (ret != ENOTSUP)
-+              goto done;
-+#endif
-+
-+#if ENABLE_FEATURE_2_4_MODULES
-+      ret = insmod_main_24(argc, argv);
-+      if (ret != ENOTSUP)
-+              goto done;
-+#endif
-+
-+      fprintf(stderr, "Error: Kernel version not supported\n");
-+      return 1;
-+
-+done:
-+      if (ret) {
-+              errno = ret;
-+              bb_perror_msg("Loading module failed");
-+              return ret;
-+      } else
-+              return 0;
-+}
+--- a/modutils/Config.in
++++ b/modutils/Config.in
+@@ -210,7 +210,7 @@ config FEATURE_MODUTILS_SYMBOLS
+ config DEFAULT_MODULES_DIR
+       string "Default directory containing modules"
+       default "/lib/modules"
+-      depends on DEPMOD || MODPROBE || MODPROBE_SMALL
++      depends on DEPMOD || INSMOD || MODPROBE || MODPROBE_SMALL
+       help
+         Directory that contains kernel modules.
+         Defaults to "/lib/modules"
This page took 0.039179 seconds and 4 git commands to generate.