[Rpm-maint] [PATCH v2 3/4] rpmplugins: Introduce new fsm_pre and fsm_post hooks

Stefan Berger stefanb at linux.vnet.ibm.com
Thu Sep 22 17:30:57 UTC 2016


Introduce fsm_pre and fsm_post hooks, which are invoked
before and after the package files are installed.

Signed-off-by: Stefan Berger <stefanb at linux.vnet.ibm.com>
---
 lib/psm.c        |  6 +++++-
 lib/rpmplugin.h  |  6 ++++++
 lib/rpmplugins.c | 35 +++++++++++++++++++++++++++++++++++
 lib/rpmplugins.h | 19 +++++++++++++++++++
 4 files changed, 65 insertions(+), 1 deletion(-)

diff --git a/lib/psm.c b/lib/psm.c
index 341441b..ddd38d1 100644
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -586,11 +586,13 @@ static rpmRC rpmpsmUnpack(rpmpsm psm)
     rpmpsmNotify(psm, RPMCALLBACK_INST_PROGRESS, 0);
 
     if (!(rpmtsFlags(psm->ts) & RPMTRANS_FLAG_JUSTDB)) {
-	if (rpmfilesFC(psm->files) > 0) {
+	fsmrc = rpmpluginsCallFsmPre(rpmtsPlugins(psm->ts), psm->te);
+	if (!fsmrc && rpmfilesFC(psm->files) > 0) {
 	    fsmrc = rpmPackageFilesInstall(psm->ts, psm->te, psm->files,
 				   psm, &failedFile);
 	    saved_errno = errno;
 	}
+	rpmpluginsCallFsmPost(rpmtsPlugins(psm->ts), psm->te, fsmrc);
     }
 
     /* XXX make sure progress reaches 100% */
@@ -627,10 +629,12 @@ static rpmRC rpmpsmRemove(rpmpsm psm)
 
     /* XXX should't we log errors from here? */
     if (!(rpmtsFlags(psm->ts) & RPMTRANS_FLAG_JUSTDB)) {
+	fsmrc = rpmpluginsCallFsmPre(rpmtsPlugins(psm->ts), psm->te);
 	if (rpmfilesFC(psm->files) > 0) {
 	    fsmrc = rpmPackageFilesRemove(psm->ts, psm->te, psm->files,
 					  psm, &failedFile);
 	}
+	rpmpluginsCallFsmPost(rpmtsPlugins(psm->ts), psm->te, fsmrc);
     }
     /* XXX make sure progress reaches 100% */
     rpmpsmNotify(psm, RPMCALLBACK_UNINST_PROGRESS, psm->total);
diff --git a/lib/rpmplugin.h b/lib/rpmplugin.h
index fd81aec..b6f230c 100644
--- a/lib/rpmplugin.h
+++ b/lib/rpmplugin.h
@@ -41,6 +41,8 @@ typedef rpmRC (*plugin_init_func)(rpmPlugin plugin, rpmts ts);
 typedef void (*plugin_cleanup_func)(rpmPlugin plugin);
 typedef rpmRC (*plugin_tsm_pre_func)(rpmPlugin plugin, rpmts ts);
 typedef rpmRC (*plugin_tsm_post_func)(rpmPlugin plugin, rpmts ts, int res);
+typedef rpmRC (*plugin_fsm_pre_func)(rpmPlugin plugin, rpmte te);
+typedef rpmRC (*plugin_fsm_post_func)(rpmPlugin plugin, rpmte te, int res);
 typedef rpmRC (*plugin_psm_pre_func)(rpmPlugin plugin, rpmte te);
 typedef rpmRC (*plugin_psm_post_func)(rpmPlugin plugin, rpmte te, int res);
 typedef rpmRC (*plugin_scriptlet_pre_func)(rpmPlugin plugin,
@@ -60,6 +62,8 @@ typedef rpmRC (*plugin_fsm_file_prepare_func)(rpmPlugin plugin, rpmfi fi,
 					      const char* path,
 					      const char *dest,
 					      mode_t file_mode, rpmFsmOp op);
+typedef rpmRC (*plugin_fsm_pre_func)(rpmPlugin plugin, rpmte te);
+typedef rpmRC (*plugin_fsm_post_func)(rpmPlugin plugin, rpmte te, int res);
 
 typedef struct rpmPluginHooks_s * rpmPluginHooks;
 struct rpmPluginHooks_s {
@@ -80,6 +84,8 @@ struct rpmPluginHooks_s {
     plugin_fsm_file_pre_func		fsm_file_pre;
     plugin_fsm_file_post_func		fsm_file_post;
     plugin_fsm_file_prepare_func	fsm_file_prepare;
+    plugin_fsm_pre_func			fsm_pre;
+    plugin_fsm_post_func		fsm_post;
 };
 
 #ifdef __cplusplus
diff --git a/lib/rpmplugins.c b/lib/rpmplugins.c
index 97e5d30..98cd5ca 100644
--- a/lib/rpmplugins.c
+++ b/lib/rpmplugins.c
@@ -401,3 +401,38 @@ rpmRC rpmpluginsCallFsmFilePrepare(rpmPlugins plugins, rpmfi fi,
 
     return rc;
 }
+
+rpmRC rpmpluginsCallFsmPre(rpmPlugins plugins, rpmte te)
+{
+    plugin_fsm_pre_func hookFunc;
+    int i;
+    rpmRC rc = RPMRC_OK;
+
+    for (i = 0; i < plugins->count; i++) {
+	rpmPlugin plugin = plugins->plugins[i];
+	RPMPLUGINS_SET_HOOK_FUNC(fsm_pre);
+	if (hookFunc && hookFunc(plugin, te) == RPMRC_FAIL) {
+	    rpmlog(RPMLOG_ERR, "Plugin %s: hook fsm_pre failed\n", plugin->name);
+	    rc = RPMRC_FAIL;
+	}
+    }
+
+    return rc;
+}
+
+rpmRC rpmpluginsCallFsmPost(rpmPlugins plugins, rpmte te, int res)
+{
+    plugin_fsm_post_func hookFunc;
+    int i;
+    rpmRC rc = RPMRC_OK;
+
+    for (i = 0; i < plugins->count; i++) {
+	rpmPlugin plugin = plugins->plugins[i];
+	RPMPLUGINS_SET_HOOK_FUNC(fsm_post);
+	if (hookFunc && hookFunc(plugin, te, res) == RPMRC_FAIL) {
+	    rpmlog(RPMLOG_WARNING, "Plugin %s: hook fsm_post failed\n", plugin->name);
+	}
+    }
+
+    return rc;
+}
diff --git a/lib/rpmplugins.h b/lib/rpmplugins.h
index 39762c3..3702526 100644
--- a/lib/rpmplugins.h
+++ b/lib/rpmplugins.h
@@ -167,6 +167,25 @@ rpmRC rpmpluginsCallFsmFilePrepare(rpmPlugins plugins, rpmfi fi,
                                    const char *path, const char *dest,
                                    mode_t mode, rpmFsmOp op);
 
+/** \ingroup rpmplugins
+ * Call the fsm pre plugin hook.
+ * @param plugins	plugins structure
+ * @param te		processed transaction element
+ * @return		RPMRC_OK on success, RPMRC_FAIL otherwise
+ */
+RPM_GNUC_INTERNAL
+rpmRC rpmpluginsCallFsmPre(rpmPlugins plugins, rpmte te);
+
+/** \ingroup rpmplugins
+ * Call the fsm post plugin hook.
+ * @param plugins	plugins structure
+ * @param te		processed transaction element
+ * @param res		fsm result code
+ * @return		RPMRC_OK on success, RPMRC_FAIL otherwise
+ */
+RPM_GNUC_INTERNAL
+rpmRC rpmpluginsCallFsmPost(rpmPlugins plugins, rpmte te, int rc);
+
 #ifdef __cplusplus
 }
 #endif
-- 
2.5.5



More information about the Rpm-maint mailing list