#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
-#include <fcntl.h>
#include <pulse/xmalloc.h>
#include <pulsecore/module.h>
#include <pulsecore/core.h>
-#include <pulsecore/llist.h>
#include <pulsecore/core-util.h>
#include <pulsecore/log.h>
#include <pulse/mainloop-api.h>
PA_MODULE_AUTHOR("Lennart Poettering");
PA_MODULE_DESCRIPTION("GConf Adapter");
PA_MODULE_VERSION(PACKAGE_VERSION);
-PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_LOAD_ONCE(true);
#define MAX_MODULES 10
#define BUF_MAX 2048
+struct userdata;
+
struct module_item {
char *name;
char *args;
};
struct module_info {
+ struct userdata *userdata;
char *name;
struct module_item items[MAX_MODULES];
}
}
-static void unload_one_module(struct userdata *u, struct module_info*m, unsigned i) {
- pa_assert(u);
+static void unload_one_module(struct module_info *m, unsigned i) {
+ struct userdata *u;
+
pa_assert(m);
pa_assert(i < m->n_items);
+ u = m->userdata;
+
if (m->items[i].index == PA_INVALID_INDEX)
return;
pa_log_debug("Unloading module #%i", m->items[i].index);
- pa_module_unload_by_index(u->core, m->items[i].index, TRUE);
+ pa_module_unload_by_index(u->core, m->items[i].index, true);
m->items[i].index = PA_INVALID_INDEX;
pa_xfree(m->items[i].name);
pa_xfree(m->items[i].args);
m->items[i].name = m->items[i].args = NULL;
}
-static void unload_all_modules(struct userdata *u, struct module_info*m) {
+static void unload_all_modules(struct module_info *m) {
unsigned i;
- pa_assert(u);
pa_assert(m);
for (i = 0; i < m->n_items; i++)
- unload_one_module(u, m, i);
+ unload_one_module(m, i);
m->n_items = 0;
}
static void load_module(
- struct userdata *u,
struct module_info *m,
unsigned i,
const char *name,
const char *args,
- pa_bool_t is_new) {
+ bool is_new) {
+ struct userdata *u;
pa_module *mod;
- pa_assert(u);
pa_assert(m);
pa_assert(name);
pa_assert(args);
+ u = m->userdata;
+
if (!is_new) {
if (m->items[i].index != PA_INVALID_INDEX &&
- strcmp(m->items[i].name, name) == 0 &&
- strcmp(m->items[i].args, args) == 0)
+ pa_streq(m->items[i].name, name) &&
+ pa_streq(m->items[i].args, args))
return;
- unload_one_module(u, m, i);
+ unload_one_module(m, i);
}
pa_log_debug("Loading module '%s' with args '%s' due to GConf configuration.", name, args);
m->items[i].index = mod->index;
}
-static void module_info_free(void *p, void *userdata) {
+static void module_info_free(void *p) {
struct module_info *m = p;
- struct userdata *u = userdata;
pa_assert(m);
- pa_assert(u);
- unload_all_modules(u, m);
+ unload_all_modules(m);
pa_xfree(m->name);
pa_xfree(m);
}
int ret = 0;
do {
- if ((opcode = read_byte(u)) < 0){
+ if ((opcode = read_byte(u)) < 0) {
if (errno == EINTR || errno == EAGAIN)
break;
goto fail;
if (!(m = pa_hashmap_get(u->module_infos, name))) {
m = pa_xnew(struct module_info, 1);
+ m->userdata = u;
m->name = name;
m->n_items = 0;
pa_hashmap_put(u->module_infos, m->name, m);
goto fail;
}
- load_module(u, m, i, module, args, i >= m->n_items);
+ load_module(m, i, module, args, i >= m->n_items);
i++;
/* Unload all removed modules */
for (j = i; j < m->n_items; j++)
- unload_one_module(u, m, j);
+ unload_one_module(m, j);
m->n_items = i;
if (!(name = read_string(u)))
goto fail;
- if ((m = pa_hashmap_get(u->module_infos, name))) {
- pa_hashmap_remove(u->module_infos, name);
- module_info_free(m, u);
- }
-
+ pa_hashmap_remove_and_free(u->module_infos, name);
pa_xfree(name);
break;
u->io_event = NULL;
}
- pa_module_unload_request(u->module, TRUE);
+ pa_module_unload_request(u->module, true);
}
}
u->core = m->core;
u->module = m;
m->userdata = u;
- u->module_infos = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+ u->module_infos = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) module_info_free);
u->pid = (pid_t) -1;
u->fd = -1;
u->fd_type = 0;
pa_close(u->fd);
if (u->module_infos)
- pa_hashmap_free(u->module_infos, module_info_free, u);
+ pa_hashmap_free(u->module_infos);
pa_xfree(u);
}