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