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.
92 lines
3.0 KiB
92 lines
3.0 KiB
7 years ago
|
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
|
||
|
|