add iw utility (untested)
[openwrt.git] / package / busybox / patches / 470-insmod_search.patch
index e0f4a81..ef372ec 100644 (file)
@@ -1,8 +1,8 @@
-Index: busybox-1.7.2/modutils/insmod.c
+Index: busybox-1.8.1/modutils/insmod.c
 ===================================================================
 ===================================================================
---- busybox-1.7.2.orig/modutils/insmod.c       2007-10-05 14:39:19.922555340 +0200
-+++ busybox-1.7.2/modutils/insmod.c    2007-10-05 14:59:26.327304435 +0200
-@@ -61,19 +61,107 @@
+--- 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 @@
  #include "libbb.h"
  #include <libgen.h>
  #include <sys/utsname.h>
  #include "libbb.h"
  #include <libgen.h>
  #include <sys/utsname.h>
@@ -17,17 +17,18 @@ Index: busybox-1.7.2/modutils/insmod.c
  #define ENABLE_FEATURE_2_4_MODULES 1
  #endif
  
  #define ENABLE_FEATURE_2_4_MODULES 1
  #endif
  
--#if !ENABLE_FEATURE_2_4_MODULES
--#define insmod_ng_main insmod_main
-+#if ENABLE_FEATURE_2_4_MODULES
-+int insmod_main_24(int argc, char **argv);
- #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
  #if ENABLE_FEATURE_2_6_MODULES
--extern int insmod_ng_main( int argc, char **argv);
+-static int insmod_ng_main(int argc, char **argv);
 +int insmod_main_26(int argc, char **argv);
 +int insmod_main_26(int argc, char **argv);
- #endif
-+int insmod_main(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 char *g_filename = NULL;
 +#define _PATH_MODULES "/lib/modules"
@@ -36,20 +37,18 @@ Index: busybox-1.7.2/modutils/insmod.c
 +                                 void *userdata, int depth)
 +{
 +      char *fullname = (char *) userdata;
 +                                 void *userdata, int depth)
 +{
 +      char *fullname = (char *) userdata;
++      char *tmp;
 +
 +      if (fullname[0] == '\0')
 +              return FALSE;
 +
 +      if (fullname[0] == '\0')
 +              return FALSE;
-+      else {
-+              char *tmp, *tmp1 = xstrdup(filename);
-+              tmp = bb_get_last_path_component(tmp1);
-+              if (strcmp(tmp, fullname) == 0) {
-+                      free(tmp1);
-+                      /* Stop searching if we find a match */
-+                      g_filename = xstrdup(filename);
-+                      return FALSE;
-+              }
-+              free(tmp1);
++
++      tmp = bb_get_last_path_component_nostrip(filename);
++      if (strcmp(tmp, fullname) == 0) {
++              /* Stop searching if we find a match */
++              g_filename = xstrdup(filename);
++              return FALSE;
 +      }
 +      }
++
 +      return TRUE;
 +}
 +
 +      return TRUE;
 +}
 +
@@ -70,7 +69,7 @@ Index: busybox-1.7.2/modutils/insmod.c
 +      if (k_version <= 4)
 +              suffix = ".o";
 +      else
 +      if (k_version <= 4)
 +              suffix = ".o";
 +      else
-+#endif
+ #endif
 +              suffix = ".ko";
 +
 +      len = strlen(filename);
 +              suffix = ".ko";
 +
 +      len = strlen(filename);
@@ -81,8 +80,12 @@ Index: busybox-1.7.2/modutils/insmod.c
 +              filename = xasprintf("%s%s", filename, suffix);
 +      } else {
 +              filename = strdup(filename);
 +              filename = xasprintf("%s%s", filename, suffix);
 +      } else {
 +              filename = strdup(filename);
-+              if ((stat(filename, &st) == 0) && S_ISREG(st.st_mode))
++              if ((stat(filename, &st) == 0) && S_ISREG(st.st_mode)) {
++                      g_filename = filename;
 +                      return 0;
 +                      return 0;
++              }
++              free(filename);
++              return ENOENT;
 +      }
 +
 +      /* next: scan /lib/modules/<release> */
 +      }
 +
 +      /* next: scan /lib/modules/<release> */
@@ -101,20 +104,28 @@ Index: busybox-1.7.2/modutils/insmod.c
 +              check_module_name_match, 0, filename, 0);
 +
 +      /* Check if we have a complete path */
 +              check_module_name_match, 0, filename, 0);
 +
 +      /* Check if we have a complete path */
-+      if (g_filename != NULL) {
-+              if ((stat(g_filename, &st) == 0) && S_ISREG(st.st_mode))
-+                      ret = 0;
-+              else
-+                      free(g_filename);
-+      }
++      if (g_filename == NULL)
++              goto done;
++
++      if ((stat(g_filename, &st) == 0) && S_ISREG(st.st_mode))
++              ret = 0;
++      else
++              free(g_filename);
++done:
 +      free(filename);
 +
 +      return ret;
 +}
 +      free(filename);
 +
 +      return ret;
 +}
- #if ENABLE_FEATURE_2_4_MODULES
-@@ -677,7 +765,6 @@
++
++/*
++ * 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
  
  
  #endif
  
  
@@ -122,14 +133,10 @@ Index: busybox-1.7.2/modutils/insmod.c
  enum { STRVERSIONLEN = 64 };
  
  /*======================================================================*/
  enum { STRVERSIONLEN = 64 };
  
  /*======================================================================*/
-@@ -790,37 +877,6 @@
- static int n_ext_modules_used;
- extern int delete_module(const char *);
+@@ -789,27 +884,6 @@
+ static char *m_fullName;
  
  
--static char *m_filename;
--static char *m_fullName;
--
--
 -/*======================================================================*/
 -
 -
 -/*======================================================================*/
 -
 -
@@ -137,35 +144,29 @@ Index: busybox-1.7.2/modutils/insmod.c
 -                              void *userdata, int depth)
 -{
 -      char *fullname = (char *) userdata;
 -                              void *userdata, int depth)
 -{
 -      char *fullname = (char *) userdata;
+-      char *tmp;
 -
 -      if (fullname[0] == '\0')
 -              return FALSE;
 -
 -      if (fullname[0] == '\0')
 -              return FALSE;
--      else {
--              char *tmp, *tmp1 = xstrdup(filename);
--              tmp = bb_get_last_path_component(tmp1);
--              if (strcmp(tmp, fullname) == 0) {
--                      free(tmp1);
--                      /* Stop searching if we find a match */
--                      m_filename = xstrdup(filename);
--                      return FALSE;
--              }
--              free(tmp1);
+-
+-      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;
 -}
 -
 -      }
 -      return TRUE;
 -}
 -
--
--/*======================================================================*/
--
- static struct obj_file *arch_new_file(void)
- {
-       struct arch_file *f;
-@@ -3952,33 +4008,33 @@
+ /*======================================================================*/
+@@ -3897,145 +3971,57 @@
  void print_load_map(struct obj_file *f);
  #endif
  
  void print_load_map(struct obj_file *f);
  #endif
  
--int insmod_main( int argc, char **argv);
--int insmod_main( int argc, char **argv)
+-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 insmod_main_24( int argc, char **argv)
  {
        char *opt_o, *arg1;
@@ -176,8 +177,9 @@ Index: busybox-1.7.2/modutils/insmod.c
        ElfW(Addr) m_addr;
        struct obj_file *f;
 -      struct stat st;
        ElfW(Addr) m_addr;
        struct obj_file *f;
 -      struct stat st;
-       char *m_name = 0;
+-      char *m_name = NULL;
 -      int exit_status = EXIT_FAILURE;
 -      int exit_status = EXIT_FAILURE;
++      char *tmp = NULL, *m_name = NULL;
 +      int ret = EINVAL;
        int m_has_modinfo;
  #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
 +      int ret = EINVAL;
        int m_has_modinfo;
  #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
@@ -186,12 +188,11 @@ Index: busybox-1.7.2/modutils/insmod.c
        int m_version, m_crcs;
  #endif
 -#if ENABLE_FEATURE_CLEAN_UP
        int m_version, m_crcs;
  #endif
 -#if ENABLE_FEATURE_CLEAN_UP
--      FILE *fp = 0;
+       FILE *fp = NULL;
 -#else
 -      FILE *fp;
 -#endif
 -      int k_version = 0;
 -#else
 -      FILE *fp;
 -#endif
 -      int k_version = 0;
-+      FILE *fp = NULL;
 +      int k_version;
        struct utsname myuname;
  
 +      int k_version;
        struct utsname myuname;
  
@@ -206,7 +207,8 @@ Index: busybox-1.7.2/modutils/insmod.c
        /* Parse any options */
        getopt32(argv, OPTION_STR, &opt_o);
        arg1 = argv[optind];
        /* Parse any options */
        getopt32(argv, OPTION_STR, &opt_o);
        arg1 = argv[optind];
-@@ -3987,110 +4043,18 @@
+       if (option_mask32 & OPT_o) { // -o /* name the output module */
+-              free(m_name);
                m_name = xstrdup(opt_o);
        }
  
                m_name = xstrdup(opt_o);
        }
  
@@ -238,7 +240,7 @@ Index: busybox-1.7.2/modutils/insmod.c
 -                      len -= 2;
 -                      tmp[len] = '\0';
 -              }
 -                      len -= 2;
 -                      tmp[len] = '\0';
 -              }
--
 -
 -#if ENABLE_FEATURE_2_6_MODULES
 -      if (k_version > 4)
 -
 -#if ENABLE_FEATURE_2_6_MODULES
 -      if (k_version > 4)
@@ -246,15 +248,20 @@ Index: busybox-1.7.2/modutils/insmod.c
 -      else
 -#endif
 -              m_fullName = xasprintf("%s.o", tmp);
 -      else
 -#endif
 -              m_fullName = xasprintf("%s.o", tmp);
++      ret = find_module(arg1);
++      if (ret)
++              goto out;
  
  
--      if (!m_name) {
+       if (!m_name) {
 -              m_name = tmp;
 -      } else {
 -              free(tmp1);
 -              m_name = tmp;
 -      } else {
 -              free(tmp1);
--              tmp1 = 0;       /* flag for free(m_name) before exit() */
--      }
--
--      /* Get a filedesc for the module.  Check we we have a complete path */
+-              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
 -      ) {
 -      if (stat(arg1, &st) < 0 || !S_ISREG(st.st_mode)
 -       || (fp = fopen(arg1, "r")) == NULL
 -      ) {
@@ -263,7 +270,6 @@ Index: busybox-1.7.2/modutils/insmod.c
 -              if (k_version) {        /* uname succeedd */
 -                      char *module_dir;
 -                      char *tmdn;
 -              if (k_version) {        /* uname succeedd */
 -                      char *module_dir;
 -                      char *tmdn;
--                      char real_module_dir[FILENAME_MAX];
 -
 -                      tmdn = concat_path_file(_PATH_MODULES, myuname.release);
 -                      /* Jump through hoops in case /lib/modules/`uname -r`
 -
 -                      tmdn = concat_path_file(_PATH_MODULES, myuname.release);
 -                      /* Jump through hoops in case /lib/modules/`uname -r`
@@ -271,46 +277,44 @@ Index: busybox-1.7.2/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... */
 -                       * follow symlinks, but we do want to follow the
 -                       * /lib/modules/`uname -r` dir, So resolve it ourselves
 -                       * if it is a link... */
--                      if (realpath(tmdn, real_module_dir) == NULL)
--                              module_dir = tmdn;
--                      else
--                              module_dir = real_module_dir;
+-                      module_dir = xmalloc_readlink(tmdn);
+-                      if (!module_dir)
+-                              module_dir = xstrdup(tmdn);
 -                      recursive_action(module_dir, ACTION_RECURSE,
 -                      recursive_action(module_dir, ACTION_RECURSE,
--                                      check_module_name_match, 0, m_fullName, 0);
+-                                      check_module_name_match, NULL, m_fullName, 0);
+-                      free(module_dir);
 -                      free(tmdn);
 -              }
 -
 -              /* Check if we have found anything yet */
 -                      free(tmdn);
 -              }
 -
 -              /* Check if we have found anything yet */
--              if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL)) {
--                      char module_dir[FILENAME_MAX];
+-              if (!m_filename || ((fp = fopen(m_filename, "r")) == NULL)) {
+-                      int r;
+-                      char *module_dir;
 -
 -                      free(m_filename);
 -
 -                      free(m_filename);
--                      m_filename = 0;
--                      if (realpath (_PATH_MODULES, module_dir) == NULL)
--                              strcpy(module_dir, _PATH_MODULES);
+-                      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/ */
 -                      /* No module found under /lib/modules/`uname -r`, this
 -                       * time cast the net a bit wider.  Search /lib/modules/ */
--                      if (!recursive_action(module_dir, ACTION_RECURSE,
--                                                  check_module_name_match, 0, m_fullName, 0)
+-                      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)
 -                      ) {
 -                      ) {
--                              if (m_filename == 0
--                               || ((fp = fopen(m_filename, "r")) == NULL)
--                              ) {
--                                      bb_error_msg("%s: no module by that name found", m_fullName);
--                                      goto out;
--                              }
--                      } else
--                              bb_error_msg_and_die("%s: no module by that name found", m_fullName);
+-                              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);
 -              }
 -      } else
 -              m_filename = xstrdup(arg1);
 -
 -      if (flag_verbose)
 -              printf("Using %s\n", m_filename);
-+      ret = find_module(arg1);
-+      if (ret)
-+              goto out;
+-
 -#if ENABLE_FEATURE_2_6_MODULES
 -      if (k_version > 4) {
 -              argv[optind] = m_filename;
 -#if ENABLE_FEATURE_2_6_MODULES
 -      if (k_version > 4) {
 -              argv[optind] = m_filename;
@@ -324,8 +328,8 @@ Index: busybox-1.7.2/modutils/insmod.c
 -#endif
  
        f = obj_load(fp, LOADBITS);
 -#endif
  
        f = obj_load(fp, LOADBITS);
-       if (f == NULL)
-@@ -4120,7 +4084,7 @@
+@@ -4062,7 +4048,7 @@
                                "\t%s was compiled for kernel version %s\n"
                                "\twhile this kernel is version %s",
                                flag_force_load ? "warning: " : "",
                                "\t%s was compiled for kernel version %s\n"
                                "\twhile this kernel is version %s",
                                flag_force_load ? "warning: " : "",
@@ -334,7 +338,7 @@ Index: busybox-1.7.2/modutils/insmod.c
                        if (!flag_force_load)
                                goto out;
                }
                        if (!flag_force_load)
                                goto out;
                }
-@@ -4173,7 +4137,7 @@
+@@ -4104,7 +4090,7 @@
        hide_special_symbols(f);
  
  #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
        hide_special_symbols(f);
  
  #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
@@ -343,19 +347,22 @@ Index: busybox-1.7.2/modutils/insmod.c
  #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
  
        new_create_module_ksymtab(f);
  #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
  
        new_create_module_ksymtab(f);
-@@ -4220,8 +4184,7 @@
+@@ -4147,18 +4133,19 @@
        if (flag_print_load_map)
                print_load_map(f);
  
 -      exit_status = EXIT_SUCCESS;
        if (flag_print_load_map)
                print_load_map(f);
  
 -      exit_status = EXIT_SUCCESS;
--
-+      ret = 0;
- out:
++      ret = EXIT_SUCCESS;
 out:
  #if ENABLE_FEATURE_CLEAN_UP
        if (fp)
  #if ENABLE_FEATURE_CLEAN_UP
        if (fp)
-@@ -4229,21 +4192,13 @@
-       free(tmp1);
-       if (!tmp1)
+               fclose(fp);
+-      free(tmp1);
+-      if (!tmp1)
++      if (tmp)
++              free(tmp);
++      else if (m_name)
                free(m_name);
 -      free(m_filename);
 +      free(g_filename);
                free(m_name);
 -      free(m_filename);
 +      free(g_filename);
@@ -363,26 +370,18 @@ Index: busybox-1.7.2/modutils/insmod.c
 -      return exit_status;
 +      return ret;
  }
 -      return exit_status;
 +      return ret;
  }
--
--
- #endif
  
  
--
- #if ENABLE_FEATURE_2_6_MODULES
--
--#include <sys/mman.h>
--#include <asm/unistd.h>
--#include <sys/syscall.h>
--
- /* We use error numbers in a loose translation... */
- static const char *moderror(int err)
- {
-@@ -4261,19 +4216,33 @@
+ #endif /* ENABLE_FEATURE_2_4_MODULES */
+@@ -4190,23 +4177,32 @@
        }
  }
  
        }
  }
  
--int insmod_ng_main(int argc, char **argv);
--int insmod_ng_main(int argc, char **argv)
+-#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;
 +int insmod_main_26(int argc, char **argv)
  {
 -      long ret;
@@ -408,15 +407,14 @@ Index: busybox-1.7.2/modutils/insmod.c
        if (!filename)
                bb_show_usage();
  
        if (!filename)
                bb_show_usage();
  
-+      g_filename = filename;
 +      ret = find_module(filename);
 +      ret = find_module(filename);
-+      if (ret)
++      if (ret || (g_filename == NULL))
 +              goto done;
 +
        /* Rest is options */
        options = xzalloc(1);
        optlen = 0;
 +              goto done;
 +
        /* Rest is options */
        options = xzalloc(1);
        optlen = 0;
-@@ -4283,36 +4252,46 @@
+@@ -4216,36 +4212,47 @@
                optlen += sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv);
        }
  
                optlen += sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv);
        }
  
@@ -464,6 +462,7 @@ Index: busybox-1.7.2/modutils/insmod.c
 +{
 +      int ret;
 +
 +{
 +      int ret;
 +
++      g_filename = NULL;
 +#if ENABLE_FEATURE_2_6_MODULES
 +      ret = insmod_main_26(argc, argv);
 +      if (ret != ENOTSUP)
 +#if ENABLE_FEATURE_2_6_MODULES
 +      ret = insmod_main_26(argc, argv);
 +      if (ret != ENOTSUP)
This page took 0.034297 seconds and 4 git commands to generate.