return 0;
}
+static void free_module_folders(void)
+{
+ int n = 0;
+
+ if (!module_folders)
+ return;
+ while (module_folders[n])
+ free(module_folders[n++]);
+ free(module_folders);
+}
+
static struct module *find_module(const char *name)
{
struct module_node *mn;
mn->avl.key = strcpy(_name, name);
mn->m = m;
mn->is_alias = is_alias;
- avl_insert(&modules, &mn->avl);
- m->refcnt += 1;
+ if (avl_insert(&modules, &mn->avl) == 0)
+ m->refcnt += 1;
+ else
+ free(mn);
}
return mn;
}
strings = map + offset;
while (true) {
+ char *end = map + offset + size;
char *sep;
int len;
- while (!strings[0])
+ while ((strings < end) && !strings[0])
strings++;
- if (strings >= map + offset + size)
+ if (strings >= end)
break;
if (is_builtin) {
sep = strstr(strings, ".");
return -1;
for (p = module_folders; *p; p++) {
snprintf(path, sizeof(path), "%s%s", *p, MOD_BUILTIN);
- if (!stat(path, &st) && S_ISREG(st.st_mode)) {
- fp = fopen(path, "r");
- if (fp)
- break;
- }
+ fp = fopen(path, "r");
+ if (!fp)
+ continue;
+
+ if (!fstat(fileno(fp), &st) && S_ISREG(st.st_mode))
+ break;
+
+ /* Not regular file, close it and check next */
+ fclose(fp);
+ fp = NULL;
}
if (!fp)
return 0; /* OK if modules.builtin unavailable */
printf("name:\t\t%s\n", m->name);
printf("filename:\t%s\n", is_builtin ? "(builtin)" : mpath);
while (true) {
+ char *end = map + offset + size;
char *pname, *pdata;
char *dup = NULL;
char *sep, *sep2;
- while (!strings[0])
+ while ((strings < end) && !strings[0])
strings++;
- if (strings >= map + offset + size)
+ if (strings >= end)
break;
if (is_builtin) {
sep = strstr(strings, ".");
printf("%s:\t%s\n", dup, sep);
} else {
sep2 = strstr(sep, ":");
- if (!sep2)
+ if (!sep2) {
+ free(dup);
break;
+ }
+
pname = strndup(sep, sep2 - sep);
sep2++;
pdata = strdup(sep2);
else
p->desc = pdata;
}
+
+ free(dup);
next_string:
strings = &sep[strlen(sep)];
- if (dup)
- free(dup);
}
list_for_each_entry(p, ¶ms, list) {
static int main_insmod(int argc, char **argv)
{
- char *name, *cur, *options;
- int i, ret, len;
+ char *name, *path, *cur, *opts = NULL;
+ int i, ret = -1, len;
if (argc < 2)
return print_insmod_usage();
if (find_module(name)) {
ULOG_ERR("module is already loaded - %s\n", name);
- return -1;
+ goto err;
}
- free_modules();
-
- for (len = 0, i = 2; i < argc; i++)
+ for (len = 1, i = 2; i < argc; i++)
len += strlen(argv[i]) + 1;
- options = malloc(len);
- if (!options) {
+ opts = malloc(len);
+ if (!opts) {
ULOG_ERR("out of memory\n");
- ret = -1;
goto err;
}
- options[0] = 0;
- cur = options;
+ opts[0] = 0;
+ cur = opts;
for (i = 2; i < argc; i++) {
- if (options[0]) {
+ if (opts[0]) {
*cur = ' ';
cur++;
}
if (init_module_folders()) {
fprintf(stderr, "Failed to find the folder holding the modules\n");
- ret = -1;
goto err;
}
- if (get_module_path(argv[1])) {
- name = argv[1];
- } else if (!get_module_path(name)) {
+ if (!(path = get_module_path(argv[1])) ||
+ (path = get_module_path(name))) {
fprintf(stderr, "Failed to find %s. Maybe it is a built in module ?\n", name);
- ret = -1;
goto err;
}
- ret = insert_module(get_module_path(name), options);
+ ret = insert_module(path, opts);
if (ret)
ULOG_ERR("failed to insert %s\n", get_module_path(name));
err:
- free(options);
+ free(opts);
+ free_modules();
+ free_module_folders();
+
return ret;
}
{
struct module *m;
char *name;
- int ret;
+ int ret = -1;
if (argc != 2)
return print_usage("rmmod");
m = find_module(name);
if (!m) {
ULOG_ERR("module is not loaded\n");
- return -1;
+ goto err;
}
if (m->state == BUILTIN) {
ULOG_ERR("module is builtin\n");
- return -1;
+ goto err;
}
ret = syscall(__NR_delete_module, m->name, 0);
if (ret)
ULOG_ERR("unloading the module failed\n");
+err:
free_modules();
+ free_module_folders();
return ret;
}
static int main_modinfo(int argc, char **argv)
{
struct module *m;
+ int rv = -1;
char *name;
if (argc != 2)
m = find_module(name);
if (!m) {
ULOG_ERR("cannot find module - %s\n", argv[1]);
- return -1;
+ goto err;
}
print_modinfo(m);
- return 0;
+ rv = 0;
+err:
+ free_modules();
+ free_module_folders();
+
+ return rv;
}
static int main_modprobe(int argc, char **argv)
}
free_modules();
+ free_module_folders();
return exit_code;
}
out:
globfree(&gl);
+ free_modules();
+ free_module_folders();
free_path:
free(path);