From 7c67f70b684870920af46c1561eedc475c4ad31f Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Fri, 16 May 2008 10:19:23 +0000 Subject: Implement support for disabling specific plugins from loading --- hcid/hcid.h | 2 +- hcid/main.c | 25 ++++++++++++++++++++++++- hcid/plugin.c | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/hcid/hcid.h b/hcid/hcid.h index 6d28bb67..099357f0 100644 --- a/hcid/hcid.h +++ b/hcid/hcid.h @@ -212,7 +212,7 @@ GSList *list_trusts(bdaddr_t *local, const char *service); int write_device_profiles(bdaddr_t *src, bdaddr_t *dst, const char *profiles); int delete_entry(bdaddr_t *src, const char *storage, const char *key); -gboolean plugin_init(void); +gboolean plugin_init(GKeyFile *config); void plugin_cleanup(void); void __probe_servers(const char *adapter); void __remove_servers(const char *adapter); diff --git a/hcid/main.c b/hcid/main.c index 980afec2..1afd3475 100644 --- a/hcid/main.c +++ b/hcid/main.c @@ -64,6 +64,23 @@ struct device_opts *parser_device; static struct device_list *device_list = NULL; static int child_pipe[2]; +static GKeyFile *load_config(const char *file) +{ + GError *err = NULL; + GKeyFile *keyfile; + + keyfile = g_key_file_new(); + + if (!g_key_file_load_from_file(keyfile, file, 0, &err)) { + error("Parsing %s failed: %s", file, err->message); + g_error_free(err); + g_key_file_free(keyfile); + return NULL; + } + + return keyfile; +} + static inline void init_device_defaults(struct device_opts *device_opts) { memset(device_opts, 0, sizeof(*device_opts)); @@ -769,6 +786,7 @@ int main(int argc, char *argv[]) GIOChannel *ctl_io, *child_io; uint16_t mtu = 0; int opt, daemonize = 1, debug = 0, sdp = 1, experimental = 0; + GKeyFile *config; /* Default HCId settings */ memset(&hcid, 0, sizeof(hcid)); @@ -871,6 +889,8 @@ int main(int argc, char *argv[]) exit(1); } + config = load_config(CONFIGDIR "/main.conf"); + if (read_config(hcid.config_file) < 0) error("Config load failed"); @@ -920,7 +940,7 @@ int main(int argc, char *argv[]) * the plugins might wanna expose some paths on the bus. However the * best order of how to init various subsystems of the Bluetooth * daemon needs to be re-worked. */ - plugin_init(); + plugin_init(config); /* Start event processor */ g_main_loop_run(event_loop); @@ -939,6 +959,9 @@ int main(int argc, char *argv[]) g_main_loop_unref(event_loop); + if (config) + g_key_file_free(config); + info("Exit"); stop_logging(); diff --git a/hcid/plugin.c b/hcid/plugin.c index f99966bf..acebed61 100644 --- a/hcid/plugin.c +++ b/hcid/plugin.c @@ -64,10 +64,39 @@ static gboolean add_plugin(GModule *module, struct bluetooth_plugin_desc *desc) return TRUE; } -gboolean plugin_init(void) +static gboolean is_disabled(const char *name, char **list) +{ + int i; + + for (i = 0; list[i] != NULL; i++) { + char *str; + gboolean equal; + + str = g_strdup_printf("lib%s.so", list[i]); + + equal = g_str_equal(str, name); + + g_free(str); + + if (equal) + return TRUE; + } + + return FALSE; +} + +gboolean plugin_init(GKeyFile *config) { GDir *dir; const gchar *file; + gchar **disabled; + + if (config) + disabled = g_key_file_get_string_list(config, "General", + "DisablePlugins", + NULL, NULL); + else + disabled = NULL; debug("Loading plugins %s", PLUGINDIR); @@ -85,6 +114,9 @@ gboolean plugin_init(void) g_str_has_suffix(file, ".so") == FALSE) continue; + if (disabled && is_disabled(file, disabled)) + continue; + filename = g_build_filename(PLUGINDIR, file, NULL); if (stat(filename, &st) < 0) { @@ -125,6 +157,8 @@ gboolean plugin_init(void) g_dir_close(dir); + g_strfreev(disabled); + return TRUE; } -- cgit