X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=kmodloader.c;h=11af0ae7c313023a039c765c64dfeb269c8fb98b;hp=ab8a00bc9f089498042a01bde06856c335009568;hb=b5dc53828bc69611cb474c95c9b23e70a2288391;hpb=102b1ad4c5c4db2c5a62f8581ab098885d4295c8;ds=sidebyside diff --git a/kmodloader.c b/kmodloader.c index ab8a00b..11af0ae 100644 --- a/kmodloader.c +++ b/kmodloader.c @@ -79,26 +79,6 @@ static void free_modules(void) free(m); } -static void replace_dash(char *s) -{ - if (*s == '-') - return; - while (s && *s) { - if (*s == '-') - *s = '_'; - s++; - } -} - -static void replace_underscore(char *s) -{ - while (s && *s) { - if (*s == '_') - *s = '-'; - s++; - } -} - static char* get_module_path(char *name) { static char path[256]; @@ -110,13 +90,6 @@ static char* get_module_path(char *name) uname(&ver); snprintf(path, 256, "%s" DEF_MOD_PATH "%s.ko", prefix, ver.release, name); - replace_dash(basename(path)); - - if (!stat(path, &s)) - return path; - - snprintf(path, 256, "%s" DEF_MOD_PATH "%s.ko", prefix, ver.release, name); - replace_underscore(basename(path)); if (!stat(path, &s)) return path; @@ -134,7 +107,6 @@ static char* get_module_name(char *path) t = strstr(name, ".ko"); if (t) *t = '\0'; - replace_dash(name); return name; } @@ -198,11 +170,9 @@ alloc_module(const char *name, const char *depends, int size) return NULL; m->avl.key = m->name = strcpy(_name, name); - replace_dash(_name); if (depends) { m->depends = strcpy(_dep, depends); - replace_dash(_dep); while (*_dep) { if (*_dep == ',') *_dep = '\0'; @@ -314,8 +284,8 @@ static int scan_module_folder(void) int j; uname(&ver); - path = alloca(sizeof(DEF_MOD_PATH "*.ko") + strlen(ver.release) + 1); - sprintf(path, DEF_MOD_PATH "*.ko", ver.release); + path = alloca(sizeof(DEF_MOD_PATH "*.ko") + strlen(prefix) + strlen(ver.release) + 1); + sprintf(path, "%s" DEF_MOD_PATH "*.ko", prefix, ver.release); if (glob(path, gl_flags, NULL, &gl) < 0) return -1; @@ -583,13 +553,13 @@ static int main_rmmod(int argc, char **argv) LOG("module is not loaded\n"); return -1; } - free_modules(); - - ret = syscall(__NR_delete_module, name, 0); + ret = syscall(__NR_delete_module, m->name, 0); if (ret) LOG("unloading the module failed\n"); + free_modules(); + return ret; } @@ -613,18 +583,29 @@ static int main_lsmod(int argc, char **argv) static int main_modinfo(int argc, char **argv) { - char *module; + struct module *m; + char *name; if (argc != 2) return print_usage("modinfo"); - module = get_module_path(argv[1]); - if (!module) { + if (scan_module_folder()) + return -1; + + name = get_module_name(argv[1]); + m = find_module(name); + if (!m) { LOG("cannot find module - %s\n", argv[1]); return -1; } - print_modinfo(module); + name = get_module_path(m->name); + if (!name) { + LOG("cannot find path of module - %s\n", m->name); + return -1; + } + + print_modinfo(name); return 0; } @@ -756,11 +737,27 @@ out: return 0; } +static int avl_modcmp(const void *k1, const void *k2, void *ptr) +{ + const char *s1 = k1; + const char *s2 = k2; + + while (*s1 && ((*s1 == *s2) || + ((*s1 == '_') && (*s2 == '-')) || + ((*s1 == '-') && (*s2 == '_')))) + { + s1++; + s2++; + } + + return *(const unsigned char *)s1 - *(const unsigned char *)s2; +} + int main(int argc, char **argv) { char *exec = basename(*argv); - avl_init(&modules, avl_strcmp, false, NULL); + avl_init(&modules, avl_modcmp, false, NULL); if (!strcmp(exec, "insmod")) return main_insmod(argc, argv);