aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-12-22 11:55:32 +0100
committerSamuel Ortiz <sameo@linux.intel.com>2010-12-22 11:55:32 +0100
commitcb25e0c169aa810d0f927ece738a8711d20a0ad0 (patch)
tree3d9188515a8a874a2a740b7b1d8a6f02ee9f4767
parenta1ad6de67fe3e182bca0b975a9a7b2322c7ac4b2 (diff)
downloadpacrunner-cb25e0c169aa810d0f927ece738a8711d20a0ad0.tar.gz
main: Add -P and -p options support
-rw-r--r--src/main.c11
-rw-r--r--src/pacrunner.h2
-rw-r--r--src/plugin.c51
3 files changed, 60 insertions, 4 deletions
diff --git a/src/main.c b/src/main.c
index 545043b..58ac09f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;
}