X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=kmodloader.c;h=ed8f833fc3932caa7bfcc54228e21bd460a1a728;hp=465d3de84206337d7f18799c93d7e3a15ba90090;hb=21a4bd04062e16164f4f3e1c67005a062f470b0c;hpb=ac2d43e7c84fa3041ee2bf5709fdf69352189317;ds=sidebyside diff --git a/kmodloader.c b/kmodloader.c index 465d3de..ed8f833 100644 --- a/kmodloader.c +++ b/kmodloader.c @@ -48,8 +48,6 @@ struct module { char *name; char *depends; char *opts; - char **aliases; - int naliases; int size; int usage; @@ -250,16 +248,11 @@ alloc_module(const char *name, const char * const *aliases, int naliases, const { struct module *m; char *_name, *_dep; - char **_aliases; - int i, len_aliases; + int i; - len_aliases = naliases * sizeof(aliases[0]); - for (i = 0; i < naliases; i++) - len_aliases += strlen(aliases[i]) + 1; m = calloc_a(sizeof(*m), &_name, strlen(name) + 1, - &_dep, depends ? strlen(depends) + 2 : 0, - &_aliases, len_aliases); + &_dep, depends ? strlen(depends) + 2 : 0); if (!m) return NULL; @@ -275,28 +268,11 @@ alloc_module(const char *name, const char * const *aliases, int naliases, const } } m->size = size; - m->naliases = naliases; - if (naliases == 0) - m->aliases = NULL; - else { - char *ptr = (char *)_aliases + naliases * sizeof(_aliases[0]); - int len; - - i = 0; - do { - len = strlen(aliases[i]) + 1; - memcpy(ptr, aliases[i], len); - _aliases[i] = ptr; - ptr += len; - i++; - } while (i < naliases); - m->aliases = _aliases; - } m->refcnt = 0; alloc_module_node(m->name, m, false); - for (i = 0; i < m->naliases; i++) - alloc_module_node(m->aliases[i], m, true); + for (i = 0; i < naliases; i++) + alloc_module_node(aliases[i], m, true); return m; } @@ -861,7 +837,7 @@ static int main_modprobe(int argc, char **argv) if (m && m->state == LOADED) { if (!quiet) ULOG_ERR("%s is already loaded\n", name); - return -1; + return 0; } else if (!m) { if (!quiet) ULOG_ERR("failed to find a module named %s\n", name); @@ -985,20 +961,23 @@ out: return 0; } +static inline char weight(char c) +{ + return c == '_' ? '-' : c; +} + 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 == '_')))) + while (*s1 && (weight(*s1) == weight(*s2))) { s1++; s2++; } - return *(const unsigned char *)s1 - *(const unsigned char *)s2; + return (unsigned char)weight(*s1) - (unsigned char)weight(*s2); } int main(int argc, char **argv)