153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 553a5a1b3Sopenharmony_ci 653a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 753a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as 853a5a1b3Sopenharmony_ci published by the Free Software Foundation; either version 2.1 of the 953a5a1b3Sopenharmony_ci License, or (at your option) any later version. 1053a5a1b3Sopenharmony_ci 1153a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1253a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1353a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1453a5a1b3Sopenharmony_ci General Public License for more details. 1553a5a1b3Sopenharmony_ci 1653a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public 1753a5a1b3Sopenharmony_ci License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1853a5a1b3Sopenharmony_ci***/ 1953a5a1b3Sopenharmony_ci 2053a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2153a5a1b3Sopenharmony_ci#include <config.h> 2253a5a1b3Sopenharmony_ci#endif 2353a5a1b3Sopenharmony_ci 2453a5a1b3Sopenharmony_ci#include <ltdl.h> 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 2753a5a1b3Sopenharmony_ci 2853a5a1b3Sopenharmony_ci#include <pulsecore/log.h> 2953a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/ltdl-helper.h> 3153a5a1b3Sopenharmony_ci 3253a5a1b3Sopenharmony_ci#include "modinfo.h" 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_ci#define PA_SYMBOL_AUTHOR "pa__get_author" 3553a5a1b3Sopenharmony_ci#define PA_SYMBOL_DESCRIPTION "pa__get_description" 3653a5a1b3Sopenharmony_ci#define PA_SYMBOL_USAGE "pa__get_usage" 3753a5a1b3Sopenharmony_ci#define PA_SYMBOL_VERSION "pa__get_version" 3853a5a1b3Sopenharmony_ci#define PA_SYMBOL_DEPRECATED "pa__get_deprecated" 3953a5a1b3Sopenharmony_ci#define PA_SYMBOL_LOAD_ONCE "pa__load_once" 4053a5a1b3Sopenharmony_ci 4153a5a1b3Sopenharmony_cipa_modinfo *pa_modinfo_get_by_handle(lt_dlhandle dl, const char *module_name) { 4253a5a1b3Sopenharmony_ci pa_modinfo *i; 4353a5a1b3Sopenharmony_ci const char* (*func)(void); 4453a5a1b3Sopenharmony_ci bool (*func2) (void); 4553a5a1b3Sopenharmony_ci 4653a5a1b3Sopenharmony_ci pa_assert(dl); 4753a5a1b3Sopenharmony_ci 4853a5a1b3Sopenharmony_ci i = pa_xnew0(pa_modinfo, 1); 4953a5a1b3Sopenharmony_ci 5053a5a1b3Sopenharmony_ci if ((func = (const char* (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_AUTHOR))) 5153a5a1b3Sopenharmony_ci i->author = pa_xstrdup(func()); 5253a5a1b3Sopenharmony_ci 5353a5a1b3Sopenharmony_ci if ((func = (const char* (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_DESCRIPTION))) 5453a5a1b3Sopenharmony_ci i->description = pa_xstrdup(func()); 5553a5a1b3Sopenharmony_ci 5653a5a1b3Sopenharmony_ci if ((func = (const char* (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_USAGE))) 5753a5a1b3Sopenharmony_ci i->usage = pa_xstrdup(func()); 5853a5a1b3Sopenharmony_ci 5953a5a1b3Sopenharmony_ci if ((func = (const char* (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_VERSION))) 6053a5a1b3Sopenharmony_ci i->version = pa_xstrdup(func()); 6153a5a1b3Sopenharmony_ci 6253a5a1b3Sopenharmony_ci if ((func = (const char* (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_DEPRECATED))) 6353a5a1b3Sopenharmony_ci i->deprecated = pa_xstrdup(func()); 6453a5a1b3Sopenharmony_ci 6553a5a1b3Sopenharmony_ci if ((func2 = (bool (*)(void)) pa_load_sym(dl, module_name, PA_SYMBOL_LOAD_ONCE))) 6653a5a1b3Sopenharmony_ci i->load_once = func2(); 6753a5a1b3Sopenharmony_ci 6853a5a1b3Sopenharmony_ci return i; 6953a5a1b3Sopenharmony_ci} 7053a5a1b3Sopenharmony_ci 7153a5a1b3Sopenharmony_cipa_modinfo *pa_modinfo_get_by_name(const char *name) { 7253a5a1b3Sopenharmony_ci lt_dlhandle dl; 7353a5a1b3Sopenharmony_ci pa_modinfo *i; 7453a5a1b3Sopenharmony_ci 7553a5a1b3Sopenharmony_ci pa_assert(name); 7653a5a1b3Sopenharmony_ci 7753a5a1b3Sopenharmony_ci if (!(dl = lt_dlopenext(name))) { 7853a5a1b3Sopenharmony_ci pa_log("Failed to open module \"%s\": %s", name, lt_dlerror()); 7953a5a1b3Sopenharmony_ci return NULL; 8053a5a1b3Sopenharmony_ci } 8153a5a1b3Sopenharmony_ci 8253a5a1b3Sopenharmony_ci i = pa_modinfo_get_by_handle(dl, name); 8353a5a1b3Sopenharmony_ci lt_dlclose(dl); 8453a5a1b3Sopenharmony_ci 8553a5a1b3Sopenharmony_ci return i; 8653a5a1b3Sopenharmony_ci} 8753a5a1b3Sopenharmony_ci 8853a5a1b3Sopenharmony_civoid pa_modinfo_free(pa_modinfo *i) { 8953a5a1b3Sopenharmony_ci pa_assert(i); 9053a5a1b3Sopenharmony_ci 9153a5a1b3Sopenharmony_ci pa_xfree(i->author); 9253a5a1b3Sopenharmony_ci pa_xfree(i->description); 9353a5a1b3Sopenharmony_ci pa_xfree(i->usage); 9453a5a1b3Sopenharmony_ci pa_xfree(i->version); 9553a5a1b3Sopenharmony_ci pa_xfree(i->deprecated); 9653a5a1b3Sopenharmony_ci pa_xfree(i); 9753a5a1b3Sopenharmony_ci} 98