Blob Blame History Raw
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