diff options
author | Lennart Poettering <lennart@poettering.net> | 2004-06-11 17:18:40 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2004-06-11 17:18:40 +0000 |
commit | aae40dcea260296d7d02d185b42f9275f34cb238 (patch) | |
tree | 368ecfed432e0ab01b50a4f88507c320b483922b /src/module.c | |
parent | 8584356bbcd0690e3094ad256646838b8b41a103 (diff) |
module dependencie foo
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@7 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/module.c')
-rw-r--r-- | src/module.c | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/src/module.c b/src/module.c index 94a43124..4aa9fd68 100644 --- a/src/module.c +++ b/src/module.c @@ -1,9 +1,68 @@ +#include <limits.h> +#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #include "module.h" + +static void free_deps(struct dependency_module** deps) { + assert(deps); + + while (*deps) { + struct dependency_module *next = (*deps)->next; + lt_dlclose((*deps)->dl); + free(deps); + *deps = next; + } +} + +static int load_deps(const char *fname, struct dependency_module **deps) { + char line[PATH_MAX]; + FILE *f; + char depfile[PATH_MAX]; + assert(fname && deps); + + snprintf(depfile, sizeof(depfile), "%s.moddep", fname); + + if (!(f = fopen(depfile, "r"))) + return -1; + + while (fgets(line, sizeof(line)-1, f)) { + lt_dlhandle dl; + char *p; + size_t l; + struct dependency_module* d; + + p = line + strspn(line, " \t"); + + l = strlen(p); + if (p[l-1] == '\n') + p[l-1] = 0; + + if (*p == '#' || *p == 0) + continue; + + load_deps(p, deps); + + if (!(dl = lt_dlopenext(p))) { + free_deps(deps); + fclose(f); + return -1; + } + + d = malloc(sizeof(struct dependency_module)); + assert(d); + d->dl = dl; + d->next = *deps; + *deps = d; + } + + fclose(f); + return 0; +} + struct module* module_load(struct core *c, const char *name, const char *argument) { struct module *m = NULL; int r; @@ -13,6 +72,12 @@ struct module* module_load(struct core *c, const char *name, const char *argumen m = malloc(sizeof(struct module)); assert(m); + m->dl = NULL; + + m->dependencies = NULL; + if (load_deps(name, &m->dependencies) < 0) + goto fail; + if (!(m->dl = lt_dlopenext(name))) goto fail; @@ -33,7 +98,6 @@ struct module* module_load(struct core *c, const char *name, const char *argumen if (!c->modules) c->modules = idxset_new(NULL, NULL); - assert(c->modules); r = idxset_put(c->modules, m, &m->index); @@ -45,6 +109,7 @@ fail: if (m->dl) lt_dlclose(m->dl); + free_deps(&m->dependencies); free(m); } @@ -56,11 +121,13 @@ static void module_free(struct module *m) { m->done(m->core, m); lt_dlclose(m->dl); + free_deps(&m->dependencies); free(m->name); free(m->argument); free(m); } + void module_unload(struct core *c, struct module *m) { assert(c && m); @@ -82,7 +149,6 @@ void module_unload_by_index(struct core *c, uint32_t index) { module_free(m); } - void free_callback(void *p, void *userdata) { struct module *m = p; assert(m); |