You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.0 KiB
91 lines
3.0 KiB
From b62a75b137bde84ec8bac92c0238502b422c56ce Mon Sep 17 00:00:00 2001 |
|
From: Panu Matilainen <pmatilai@redhat.com> |
|
Date: Tue, 24 Jun 2014 14:37:38 +0300 |
|
Subject: [PATCH] Initialize plugins based on DSO discovery |
|
|
|
- %__transaction_plugins style configuration is problematic for plugins |
|
because we want plugins to be, well, pluggable. As in drop-in to |
|
enable, which is not achievable with a single macro entry. Look up |
|
all DSO's from the plugin dir and enable if a matching |
|
%__transaction_foo macro is defined. |
|
- This isn't optimal but it'll buy us the drop-in capability, which |
|
is what matters most right now. We'll want to have forcability as |
|
well later on (ie it should be possible to require given plugins |
|
to be present) |
|
|
|
Conflicts: |
|
lib/transaction.c |
|
--- |
|
lib/rpmplugins.c | 3 ++- |
|
lib/transaction.c | 34 +++++++++++++++++----------------- |
|
2 files changed, 19 insertions(+), 18 deletions(-) |
|
|
|
diff --git a/lib/rpmplugins.c b/lib/rpmplugins.c |
|
index 7285f54..4e600db 100644 |
|
--- a/lib/rpmplugins.c |
|
+++ b/lib/rpmplugins.c |
|
@@ -84,8 +84,9 @@ rpmRC rpmpluginsAddPlugin(rpmPlugins plugins, const char *type, const char *name |
|
|
|
path = rpmExpand("%{?__", type, "_", name, "}", NULL); |
|
if (!path || rstreq(path, "")) { |
|
- rpmlog(RPMLOG_ERR, _("Failed to expand %%__%s_%s macro\n"), |
|
+ rpmlog(RPMLOG_DEBUG, _("Plugin %%__%s_%s not configured\n"), |
|
type, name); |
|
+ rc = RPMRC_NOTFOUND; |
|
goto exit; |
|
} |
|
|
|
diff --git a/lib/transaction.c b/lib/transaction.c |
|
index 08a5643..386f107 100644 |
|
--- a/lib/transaction.c |
|
+++ b/lib/transaction.c |
|
@@ -1440,29 +1440,29 @@ static int rpmtsProcess(rpmts ts) |
|
static rpmRC rpmtsSetupTransactionPlugins(rpmts ts) |
|
{ |
|
rpmRC rc = RPMRC_OK; |
|
- char *plugins = NULL, *plugin = NULL; |
|
- const char *delims = ","; |
|
+ ARGV_t files = NULL; |
|
+ int nfiles = 0; |
|
+ char *dsoPath = NULL; |
|
|
|
- plugins = rpmExpand("%{?__transaction_plugins}", NULL); |
|
- if (!plugins || rstreq(plugins, "")) { |
|
- goto exit; |
|
- } |
|
+ /* |
|
+ * Assume allocated equals initialized. There are some oddball cases |
|
+ * (verification of non-installed package) where this is not true |
|
+ * currently but that's not a new issue. |
|
+ */ |
|
|
|
- plugin = strtok(plugins, delims); |
|
- while(plugin != NULL) { |
|
- rpmlog(RPMLOG_DEBUG, "plugin is %s\n", plugin); |
|
- if (!rpmpluginsPluginAdded(ts->plugins, (const char*)plugin)) { |
|
- if (rpmpluginsAddPlugin(ts->plugins, "transaction", |
|
- (const char*)plugin) == RPMRC_FAIL) { |
|
- /* any configured plugin failing to load is a failure */ |
|
+ dsoPath = rpmExpand("%{__plugindir}/*.so", NULL); |
|
+ if (rpmGlob(dsoPath, &nfiles, &files) == 0) { |
|
+ rpmPlugins tsplugins = rpmtsPlugins(ts); |
|
+ for (int i = 0; i < nfiles; i++) { |
|
+ char *bn = basename(files[i]); |
|
+ bn[strlen(bn)-strlen(".so")] = '\0'; |
|
+ if (rpmpluginsAddPlugin(tsplugins, "transaction", bn) == RPMRC_FAIL) |
|
rc = RPMRC_FAIL; |
|
- } |
|
} |
|
- plugin = strtok(NULL, delims); |
|
+ files = argvFree(files); |
|
} |
|
+ free(dsoPath); |
|
|
|
-exit: |
|
- free(plugins); |
|
return rc; |
|
} |
|
|
|
-- |
|
2.1.0 |
|
|
|
|