static pa_hook_result_t device_unlink_hook_cb(pa_core *c, pa_object *o, struct userdata *u) { pa_assert(c); pa_object_assert_ref(o); pa_assert(u); pa_hashmap_remove_and_free(u->device_infos, o); return PA_HOOK_OK; }
int handle_event(struct userdata *u) { int opcode; int ret = 0; do { if ((opcode = read_byte(u)) < 0) { if (errno == EINTR || errno == EAGAIN) break; goto fail; } switch (opcode) { case '!': /* The helper tool is now initialized */ ret = 1; break; case '+': { char *name; struct pa_module_info *m; unsigned i, j; if (!(name = read_string(u))) goto fail; if (!(m = pa_hashmap_get(u->module_infos, name))) { m = pa_xnew(struct pa_module_info, 1); m->userdata = u; m->name = name; m->n_items = 0; pa_hashmap_put(u->module_infos, m->name, m); } else pa_xfree(name); i = 0; while (i < MAX_MODULES) { char *module, *args; if (!(module = read_string(u))) { if (i > m->n_items) m->n_items = i; goto fail; } if (!*module) { pa_xfree(module); break; } if (!(args = read_string(u))) { pa_xfree(module); if (i > m->n_items) m->n_items = i; goto fail; } load_module(m, i, module, args, i >= m->n_items); i++; pa_xfree(module); pa_xfree(args); } /* Unload all removed modules */ for (j = i; j < m->n_items; j++) unload_one_module(m, j); m->n_items = i; break; } case '-': { char *name; if (!(name = read_string(u))) goto fail; pa_hashmap_remove_and_free(u->module_infos, name); pa_xfree(name); break; } }