diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2010-12-22 11:55:32 +0100 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-12-22 11:55:32 +0100 |
commit | cb25e0c169aa810d0f927ece738a8711d20a0ad0 (patch) | |
tree | 3d9188515a8a874a2a740b7b1d8a6f02ee9f4767 | |
parent | a1ad6de67fe3e182bca0b975a9a7b2322c7ac4b2 (diff) | |
download | pacrunner-cb25e0c169aa810d0f927ece738a8711d20a0ad0.tar.gz |
main: Add -P and -p options support
-rw-r--r-- | src/main.c | 11 | ||||
-rw-r--r-- | src/pacrunner.h | 2 | ||||
-rw-r--r-- | src/plugin.c | 51 |
3 files changed, 60 insertions, 4 deletions
@@ -61,6 +61,8 @@ static void disconnect_callback(DBusConnection *conn, void *user_data) } static gchar *option_debug = NULL; +static gchar *option_plugin = NULL; +static gchar *option_noplugin = NULL; static gboolean option_detach = TRUE; static gboolean option_version = FALSE; @@ -82,6 +84,10 @@ static GOptionEntry options[] = { { "nodaemon", 'n', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &option_detach, "Don't fork daemon to background" }, + { "plugin", 'p', 0, G_OPTION_ARG_STRING, &option_plugin, + "Specify plugins to load", "NAME,..." }, + { "noplugin", 'P', 0, G_OPTION_ARG_STRING, &option_noplugin, + "Specify plugins not to load", "NAME,..." }, { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version, "Show version information and exit" }, { NULL }, @@ -163,7 +169,10 @@ int main(int argc, char *argv[]) __pacrunner_manager_init(conn); __pacrunner_client_init(conn); __pacrunner_manual_init(); - __pacrunner_plugin_init(); + __pacrunner_plugin_init(option_plugin, option_noplugin); + + g_free(option_plugin); + g_free(option_noplugin); memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_term; diff --git a/src/pacrunner.h b/src/pacrunner.h index 8cf62f4..1a2b5db 100644 --- a/src/pacrunner.h +++ b/src/pacrunner.h @@ -41,7 +41,7 @@ void __pacrunner_log_cleanup(void); #include "plugin.h" -int __pacrunner_plugin_init(void); +int __pacrunner_plugin_init(const char *pattern, const char *exclude); void __pacrunner_plugin_cleanup(void); diff --git a/src/plugin.c b/src/plugin.c index bfeb3a8..fea9204 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -64,10 +64,38 @@ static gboolean add_plugin(void *handle, struct pacrunner_plugin_desc *desc) return TRUE; } +static gboolean check_plugin(struct pacrunner_plugin_desc *desc, + char **patterns, char **excludes) +{ + if (excludes) { + for (; *excludes; excludes++) + if (g_pattern_match_simple(*excludes, desc->name)) + break; + if (*excludes) { + pacrunner_info("Excluding %s", desc->name); + return FALSE; + } + } + + if (patterns) { + for (; *patterns; patterns++) + if (g_pattern_match_simple(*patterns, desc->name)) + break; + if (!*patterns) { + pacrunner_info("Ignoring %s", desc->name); + return FALSE; + } + } + + return TRUE; +} + #include "builtin.h" -int __pacrunner_plugin_init(void) +int __pacrunner_plugin_init(const char *pattern, const char *exclude) { + gchar **patterns = NULL; + gchar **excludes = NULL; GDir *dir; const char *file; unsigned int i; @@ -77,8 +105,19 @@ int __pacrunner_plugin_init(void) DBG(""); - for (i = 0; __pacrunner_builtin[i]; i++) + if (pattern) + patterns = g_strsplit_set(pattern, ", ", -1); + + if (exclude) + excludes = g_strsplit_set(exclude, ", ", -1); + + for (i = 0; __pacrunner_builtin[i]; i++) { + if (check_plugin(__pacrunner_builtin[i], + patterns, excludes) == FALSE) + continue; + add_plugin(NULL, __pacrunner_builtin[i]); + } dir = g_dir_open(PLUGINDIR, 0, NULL); if (dir == NULL) @@ -113,12 +152,20 @@ int __pacrunner_plugin_init(void) continue; } + if (check_plugin(desc, patterns, excludes) == FALSE) { + dlclose(handle); + continue; + } + if (add_plugin(handle, desc) == FALSE) dlclose(handle); } g_dir_close(dir); + g_strfreev(patterns); + g_strfreev(excludes); + return 0; } |